
windows自带的画图程序的用途是:可以编辑、处理,为加上文字说明,对进行挖、补、裁剪,还支持翻转、拉伸、反色等 *** 作。它的工具箱包括画笔、点、线框及橡皮擦、喷q、刷子等一系列工具。具有完成一些常见的编辑器的基本功能。用它来处理,方便实用,效果不错。
颜色的选取
Windows画图程序颜料盒中只默认有28种颜色,而很多时候我们需用到其它一些颜色,这时就要用到自定义颜色了。打开菜单栏上的“颜色”选项,出现一下拉菜单,点击“编辑颜色”,d出一编辑颜色对话框,选取所需的自定义颜色,点击“确定”按钮,这时我们发现刚才自定义的颜色被添加到程序窗口左下角的颜料盒中,我们就可以用这种颜色来画线或进行其它的 *** 作了。
有时我们想引用某一幅图形中的某种颜色,而自定义又不能很精确地达到要求,这时就可用下面的方法解决:打开需引用颜色的图形,用“选取”工具在图形上选择所需颜色的一小部分图形,点击“编辑”下拉菜单中的“复制”按钮,关闭引用的图形,再打开我们要进行处理的图形,点击“编辑”下拉菜单中的“粘贴”按钮,被复制的一部分图形出现在当前图形的左上角,此时这一部分图形四周有一虚线框,用鼠标移动这部分图形到当前图形上某一空白处,然后光标在图形上其它位置轻点一下,则复制的这一小块图形被粘贴在当前图形上。点按工具箱中的“取色”笔,将光标移到我们刚才粘贴的一小块图形上,让笔尖对准欲选取的颜色处轻轻点按一下鼠标左键,所选取的颜色就被添加到“颜料盒”中,我们就可以使用这种颜色了,这时可以擦除掉粘贴的部分图形。对于同一幅图形中颜色的引用,我们也可以使用“取色”笔来完成,这样取色比自定义更快更方便,当然,对使用已经在图形中存在的颜色才能这么做。
画图中前景色和背景色的选择分别通过鼠标左/右键来控制, *** 作如下(请注意屏幕上前景色和背景色的变化):
1.用鼠标左键单击颜料盒上某颜色,或者用“取色”在“绘图区”鼠标左键单击,将其定义为前景色;
2.用鼠标右键单击颜料盒上某颜色,或者用“取色”在“绘图区”鼠标右键单击,将其定义为背景色。
3 按住“Ctrl”键,用鼠标单击(左、右键皆可),可以定义透明色,由于“透明色”是gif所特有的,我们用不到,但是它毕竟给我们提供了这第三种选择。使用的时候也要按住“Ctrl”键。
“橡皮/颜色橡皮”所使用的是背景色,即擦出色效果是背景色所定义的。
当部分被“选定”移动以后,留下的就是背景色。
“透明”与“不透明”所认定的标准也是背景色。
所以要善用“背景色”,在出现以上三点 *** 作的时候,除特别需要,请将“背景色”更换为“白色”。
“橡皮/颜色橡皮”当你设定了前景色,用鼠标右键使用的时候,就是限制只擦出与前景色相同的颜色区域。
按住SHIFT键,在使用“直线、曲线”时可以拉出水平、垂直或斜45度的直线。使用“椭圆”可以绘出正圆,同理“矩形、圆角矩形”可以绘出正方。
椭圆、矩形、多边形和园角矩形:这四个位于工具栏下方的工具 *** 作相似,可以用来绘制相应的图形。工具栏附栏的三种选择由上往下分别为:空框图形(前景色为框)、有边框实心图形(前景色为框,背景色为心)、无边框实心图形(背景色为心)。
选择纯色的方法。通过双击坐下角的“颜料盒”,d出的“编辑颜色”对话框,点“规定自定义颜色(D)>>”打开调色版,在调色板上选择,相应颜色会在调色板左下角的颜色框显示出来,双击这个颜色框(就是那个“颜色|纯色(D)”上面的),如果你选择的不是纯色,你会发现颜色稍有变动,这时的颜色就是纯色了。比如我选择一个深蓝色,其RGB值为99\102\220,选择纯色后RGB值变为了96\104\224,点击“确定”。
当要绘制左右对称的图像的时候,我们可以用到“翻转”的功能。启用方法:将刚画的一侧脸部的线条复制,然后再粘贴(不要取消图像区域的选择),点“图像”菜单/“翻转/旋转(F)”,d出对话框,选择“水平翻转”,确定。
当要处理得非常细致的时候,一般都是用“放大镜”工具将图像放大,才进行绘制的。为了让我们将每个点定位得更准确,我们需要“网格”。启用方法:先用“放大镜”工具将图像放大(注意不要是2倍,因为2倍的时候不支持网格),随后点“查看”菜单/“缩放”/“显示网格(G)”。
在绘制过程中,我们要经常把图像缩小到原始尺寸看效果,我这我们可以使用“查看”菜单/“缩放”/“显示缩略图(H)”。
可以说2倍大小的总用并不大,除特殊需要,不推荐使用。
“查看”菜单/“缩放”/“大尺寸”,属于4倍放大,且是“放大镜”默认值,也是从这里才开始支持“网格”的。
呵呵,哥们,我们也刚学完这些,以下代码给你,要的基本符合,不过你得要在加2个资源(在insert的resource中)“鼠标的(cursor)和菜单栏的(menu)”,不加是不行的,加了后该修改的你能看的懂的,实在不行,我就直接发文件给你:
#include <windowsh>
#include "resourceh"
#include <stringh>
#include <stdioh>
#include <mathh>
HINSTANCE g_hInstance;
int g_nToolID = 0;
struct tagLine
{
POINT ptB;
POINT ptE;
bool bIsDelete;
};
tagLine g_AllLines[100];//直线数组
int g_nLineNumber = 0; //实际直线数
struct tagCircle
{
POINT ptCenter;
int nRadius;
bool bIsDelete;
};
tagCircle g_AllCircles[100];//整圆数组
int g_nCircleNumber = 0; // 实际保存的圆个数
POINT pt1 = {200,200};
POINT pt2 = {200,200};
POINT pt3 = {0,0};
int g_nState = 0;
//功能:画一线直线段
void DrawLine(HDC hDC,POINT ptB,POINT ptE)
{
::MoveToEx(hDC,ptBx,ptBy,NULL);
::LineTo(hDC,ptEx,ptEy);
}
//功能:已知两点求距离
int Distance(POINT pt1,POINT pt2)
{
int nR = 0;
nR=sqrt((pt1x - pt2x)(pt1x - pt2x) +(pt1y - pt2y)(pt1y- pt2y));
return nR;
}
void DrawCircle(HDC hDC,POINT ptC,int nR)
{
::Ellipse(hDC,ptCx - nR,ptCy - nR,ptCx + nR,ptCy + nR);
}
void OnMouseMove(POINT ptPos,HWND hWnd)
{
if(g_nToolID == ID_CIRCLE)
{
if(g_nState == 1)
{
HDC hDC = ::GetDC(hWnd);
//取得系统预定义一个“空心刷子”
HBRUSH hBrush = (HBRUSH)::GetStockObject(NULL_BRUSH);
::SelectObject(hDC,hBrush);
::SetROP2(hDC,R2_NOTXORPEN);
DrawLine(hDC,pt1,pt2);
int nR = Distance(pt1,pt2);
DrawCircle(hDC,pt1,nR);
pt3 = ptPos;
nR = Distance(pt1,pt3);
DrawCircle(hDC,pt1,nR);
DrawLine(hDC,pt1,pt3);
pt2 = pt3;
::ReleaseDC(hWnd,hDC);
}
}else if(g_nToolID == ID_LINE)
{
if(g_nState == 1)
{
HDC hDC = ::GetDC(hWnd);
pt3=ptPos;
//用背景色,绘制上一次的位置==>擦除
::SetROP2(hDC,R2_NOTXORPEN);
::DrawLine(hDC,pt1,pt2);
::DrawLine(hDC,pt1,pt3);
pt2 = pt3;
::ReleaseDC(hWnd,hDC);
}
}
}
void OnLButtonUp(POINT ptPos)
{
if(g_nToolID == ID_CIRCLE)
{
if(g_nState == 1)
{
tagCircle aCir;
aCirptCenter = pt1;
aCirnRadius = Distance(pt1,ptPos);
aCirbIsDelete = false;
g_AllCircles[g_nCircleNumber] = aCir;
g_nCircleNumber = g_nCircleNumber + 1;
g_nState = 0;
}
}else if(g_nToolID == ID_LINE)
{
if(g_nState == 1)
{
g_nState = 0;
tagLine aLine;
aLineptB = pt1;
aLineptE = pt3;
aLinebIsDelete = false;
g_AllLines[g_nLineNumber] = aLine;
g_nLineNumber = g_nLineNumber + 1;
}
}
}
//功能:判断点是否在直线段上
bool PtOnCircle(POINT pt,POINT ptC,int nR)
{
int nL = Distance(pt,ptC);
if( fabs(nL - nR) < 5 )
{
return true;
}else
{
return false;
}
}
//功能:判断点是否在直线段上
bool PtOnLine(POINT pt,POINT ptB,POINT ptE)
{
int nL1 = Distance(pt,ptB);
int nL2 = Distance(pt,ptE);
int nL3 = Distance(ptB,ptE);
if( fabs(( nL1 + nL2 ) - nL3) < 5 )
{
return true;
}else
{
return false;
}
}
void OnLButtonDown(HWND hWnd,POINT ptPos)
{
if(g_nToolID == ID_CIRCLE)
{
if(g_nState == 0)
{
g_nState = 1;
pt2 = pt1 = ptPos;
}
}else if(g_nToolID == ID_LINE)
{
if(g_nState == 0)
{
g_nState = 1;
pt2 = pt1 = ptPos;
}
}else if(g_nToolID == ID_DELETE)
{
//判断当前鼠标点是否在某一个直线段上
for(int nI = 0; nI < g_nLineNumber; nI = nI + 1)
{
tagLine pLine = &g_AllLines[nI];
if(PtOnLine(ptPos,(pLine)ptB,(pLine)ptE))
{
char cTxt[100];
sprintf(cTxt,"nI = %d\n",nI);
::OutputDebugString(cTxt);
(pLine)bIsDelete = true;
break;
}
}
//判断当前鼠标点是否在某一个圆上
for(nI = 0; nI < g_nCircleNumber; nI = nI + 1)
{
tagCircle pCircle = &g_AllCircles[nI];
if(PtOnCircle(ptPos,(pCircle)ptCenter,(pCircle)nRadius))
{
(pCircle)bIsDelete = true;
break;
}
}
::InvalidateRect(hWnd,NULL,TRUE);
}
}
void OnPaint(HDC hDC)
{
// 1重绘圆
//取得系统预定义一个“空心刷子”
HBRUSH hBrush = (HBRUSH)::GetStockObject(NULL_BRUSH);
::SelectObject(hDC,hBrush);
for(int nI = 0; nI < g_nCircleNumber; nI++)
{
tagCircle aCir;
aCir = g_AllCircles[nI];
if(aCirbIsDelete == false)
{
DrawCircle(hDC,aCirptCenter,aCirnRadius);
}
}
// 2重绘直线段
for(nI = 0; nI < g_nLineNumber; nI = nI + 1)
{
tagLine aLine = g_AllLines[nI];
if(aLinebIsDelete == false)
{
::DrawLine(hDC,aLineptB,aLineptE);
}
}
}
void OnCommand(HWND hWnd,int nCmdID)
{
switch(nCmdID)
{
case ID_EXIT:
::DestroyWindow(hWnd);
break;
case ID_LINE:
g_nToolID = ID_LINE;
break;
case ID_CIRCLE:
g_nToolID = ID_CIRCLE;
break;
case ID_DELETE:
g_nToolID = ID_DELETE;
break;
}
}
// 窗口回调函数
int WndProc(HWND hWnd,
int message,
int wParam,
int lParam)
{
switch (message)
{
case WM_SETCURSOR:
{
HCURSOR hCur1 = ::LoadCursor(g_hInstance,"pen_cursor");
HCURSOR hCur2 = ::LoadCursor(g_hInstance,"hand_cursor");
HCURSOR hCur3 = ::LoadCursor(g_hInstance,"point_cursor");
HCURSOR hCur4 = ::LoadCursor(g_hInstance,"arrow_cursor");
switch(g_nToolID)
{
case ID_LINE:
::SetCursor(hCur1);
break;
case ID_CIRCLE:
::SetCursor(hCur2);
break;
case ID_DELETE:
::SetCursor(hCur3);
break;
default:
::SetCursor(hCur1);
}
break;
}
case WM_COMMAND:
{
int nID = LOWORD(wParam);
OnCommand(hWnd,nID);
break;
}
case WM_LBUTTONDOWN:
{
POINT ptPos;
ptPosx = LOWORD(lParam);
ptPosy = HIWORD(lParam);
OnLButtonDown(hWnd,ptPos);
}
break;
case WM_LBUTTONUP:
{
POINT ptPos;
ptPosx = LOWORD(lParam);
ptPosy = HIWORD(lParam);
OnLButtonUp(ptPos);
}
break;
case WM_MOUSEMOVE:
{
POINT ptPos;
ptPosx = LOWORD(lParam);
ptPosy = HIWORD(lParam);
OnMouseMove(ptPos,hWnd);
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hDC = ::BeginPaint(hWnd,&ps);
OnPaint(hDC);
::EndPaint(hWnd,&ps);
break;
}
case WM_DESTROY: //窗口关闭时发送
::PostQuitMessage(0); //在消息队列的尾部添加一个0消息,以示,结束程序
break;
default:
return ::DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
int WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
char lpCmdLine,
int nCmdShow)
{
g_hInstance = hInstance;
WNDCLASSEX wcex;
wcexcbSize = sizeof(WNDCLASSEX);
wcexstyle = CS_HREDRAW | CS_VREDRAW;
wcexlpfnWndProc = (WNDPROC)WndProc;
wcexcbClsExtra = 0;
wcexcbWndExtra = 0;
wcexhInstance = hInstance;
wcexhIcon = NULL;
wcexhCursor = LoadCursor(NULL, IDC_ARROW);
wcexhbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcexlpszMenuName = "menu1";
wcexlpszClassName = "ABCDE";
wcexhIconSm = NULL;
RegisterClassEx(&wcex);
HWND hWnd = CreateWindow("ABCDE",
"WanJie",
WS_OVERLAPPEDWINDOW,
50, 50, //(x,y)
500, 500, // (w,h)
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hWnd,SW_SHOW);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
DispatchMessage(&msg);
}
return 1;
}
CDC类不是有现成的函数么
CDC pdc = CDC::FromHandle(hdc);
pdc->MoveTo(ps);
pdc->LineTo(pe);
以下是引用:
直线段的扫描转换算法
1 数值微分(DDA)法
我的理解就是以一个坐标轴为步长值(增量为1),另一个坐标根据直线的斜率(K)为
增量,然后四舍五入进行计算机,确定每一个点的坐标。
具体算法(我用OPENGL模拟)
void setPixel(GLint xCoord,GLint yCoord)
{
glBegin(GL_POINTS);
glVertex2i(xCoord,yCoord);
glEnd();
}
inline int round(const float a)
{
return int(a+05);
}
void lineDDA(int x0,int y0,int xEnd,int yEnd)
{
int dx = xEnd - x0,dy = yEnd - y0,steps,k;
float xIncrement,yIncrement,x = x0,y=y0;
if(abs(dx)>abs(dy))
{
steps = abs(dx);
}
else
{
steps = abs(dy);
}
xIncrement = float(dx)/float(steps);
yIncrement = float(dy)/float(steps);
setPixel(round(x),round(y));
for(k = 0;k<steps;k++)
{
x+=xIncrement;
y+=yIncrement;
setPixel(round(x),round(y));
}
}
2中点画线法
同样我理解的算法就是,以一个增量为多的坐标轴为步长值(为1),而另一个坐标
值是加1,还是不变取决于这两个坐标值中点是在这条直线的上方,还是下方。
具体算法如下:
void lineMiddle(int x0,int y0,int xEnd,int yEnd)
{
int a,b,c,d1,d2,d;
a = y0-yEnd;
b = xEnd-x0;
d = 2a+b;//判别试(2a+b为初始值)
d1 = 2a;//中点在直线下方增量值
d2 = 2a+b;//中点在真线上方的增量值
int x,y;
x = x0;y=y0;
setPixel(x,y);
while(x<xEnd)
{
if(d<0)//中点在直线下方
{
x++;
y++;
d+=d2;
}
else//中点在直线上方
{
x++;
d+=d1;
}
setPixel(x,y);
}
}
3Bresenham画线算法程序:
用一个坐标轴来当步长值(即+1),另一个坐标轴是否加1则跟据斜率(k)来确定,K
如果大于05,那么也加+1,如果小于05那么即不变。为了方便计算,如果d大于1
,那么就减一,归0。可设e,e=d-05,于是就有e>0时,加1,e<0时不变,这样便
于硬件实现。
算法实现如下:
void lineBresenham(int x0,int y0,int x1,int y1)
{
int x,y,dx,dy;
float k,e;
dx = x1 - x0;
dy = y1 - y0;;
k = (float)dy/dx;
e = -05;
x = x0;
y = y0;
setPixel(x,y);
for(int i =0;i<dx;i++)
{
x = x+1;
e = e+k;
if(e>=0)
{
y++;
e = e-1;
}
setPixel(x,y);
}
}
这个简单,用MoveTo 和LineTo就行了。如有下面2个点,x(1,2),y(8,9)
你只要MoveTo(1,2);
LineTo(8,9);
如果你是要任意输入2个点的话,那么先将输入的点先转化为浮点型,用atof函数,这个函数使用起来很简单,就是把字符型转化为浮点型。这样就好了。
1、打开画图程序:在Windows *** 作系统中,依次点击开始菜单->所有程序-附件-画图。
2、选择画图工具:在画图程序上方的工具栏中,可以看到多种不同的绘图工具,包括画笔、铅笔、直线、箭头等,根据需要选择合适的工具进行绘图。
3、绘制图形:选择合适的绘图工具后,可以在画图区域内进行绘制。
4、修改图形属性:在绘制完图形后,可以通过格式菜单进行图形属性的修改。
5、保存图形:在完成绘制后,可以通过文件菜单中的保存选项将图形保存到本地硬盘中,可以直接使用复制和粘贴命令将图形插入到Word文档或其他应用程序中。
以上就是关于windows自带的画图程序的用途是全部的内容,包括:windows自带的画图程序的用途是、windows画图程序问题、帮我写个画图程序,用win32 API,实现画圆,画矩形等,用到控件 ,鼠标消息处理等。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)