想实现如下简单功能,先在界面上画一椭圆,通过单击鼠标左键实现,再单击右键画一饼形。现无论如何都不能同时画出,只能先化一个,通过改变窗口大小来刷新窗口,画另外一个。知道是WM_PAINT消息从中作梗,但不知怎么改?
代码如下:
#include<windows.h>
#include<stdlib.h>
#include<string.h>
long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam );
BOOL InitWindowsClass(HINSTANCE hInstance);
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);
HWND hWndMain;//主函数
int WINAPI WinMain
(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
MSG Message;
if(!InitWindowsClass(hInstance))
return FALSE;
if(!InitWindows(hInstance,nCmdShow))
return FALSE;
while(GetMessage(&Message,0,0,0)) //消息循环
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}long WINAPI WndProc //消息处理函数
(
HWND hWnd,
UINT iMessage,
UINT wParam,
LONG lParam
)
{
HDC hDC;    //定义指向设备描述表的句柄
HBRUSH hBrush,oldBrush;   //定义指向画刷的句柄
HPEN hPen,oldPen; //定义指向画笔的句柄
PAINTSTRUCT PtStr;  //定义指向包含绘图信息的结构体变量
switch(iMessage)   //处理消息
{
case WM_PAINT:  //处理绘图消息

return 0; case WM_LBUTTONDOWN:
hDC=BeginPaint(hWnd,&PtStr);
//hDC=GetClientDC(); SetMapMode(hDC,MM_ANISOTROPIC); //设置映像模式
//设置画笔。采用系统预定定义的黑色画笔
hPen=(HPEN)GetStockObject(BLACK_PEN);  
//定义画刷,采用系统预定义的深灰色画刷
    hBrush=(HBRUSH)GetStockObject(DKGRAY_BRUSH);
oldBrush=SelectObject(hDC,hBrush); //选择画刷
oldPen=SelectObject(hDC,hPen); //选择画笔
//RoundRect(hDC,50,120,100,200,15,15); //圆角矩形
//定义画刷,采用系统预定义的亮灰色画刷
//hBrush=(HBRUSH)GetStockObject(LTGRAY_BRUSH);
//SelectObject(hDC,hBrush); //选择画刷
Ellipse(hDC,0,50,200,150); //椭圆
//定义画刷,采用系统预定义的虚画刷
//hBrush=(HBRUSH)GetStockObject(HOLLOW_BRUSH);
//SelectObject(hDC,hBrush); //选择画刷
//Pie(hDC,250,50,300,100,250,50,300,50); //饼形
SelectObject(hDC,oldPen);
SelectObject(hDC,oldBrush);
EndPaint(hWnd,&PtStr); //结束绘图
UpdateWindow(hWnd);
//delete PtStr;
return 0;
case WM_RBUTTONDOWN:
  hDC=BeginPaint(hWnd,&PtStr);
SetMapMode(hDC,MM_ANISOTROPIC); //设置映像模式

hBrush=(HBRUSH)GetStockObject(HOLLOW_BRUSH);
oldBrush=SelectObject(hDC,hBrush); //选择画刷

Pie(hDC,550,550,300,100,250,50,300,50); //饼形
SelectObject(hDC,hBrush);
//SelectObject(hDC,oldPen);
//SelectObject(hDC,oldBrush);
EndPaint(hWnd,&PtStr); //结束绘图
UpdateWindow(hWnd);
return 0; case WM_DESTROY: //结束应用程序
PostQuitMessage(0);
return 0;
default: //其他消息处理程序
return(DefWindowProc(hWnd,iMessage,wParam,lParam)) ;
}
}BOOL InitWindows(HINSTANCE hInstance,int nCmdShow) //初始化窗口
{
HWND hWnd;
hWnd=CreateWindow("WinFill",   //生成窗口
"填充示例程序",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL);
if(!hWnd)
return FALSE;
hWndMain=hWnd;
ShowWindow(hWnd,nCmdShow); //显示窗口
UpdateWindow(hWnd);
return TRUE;
}BOOL InitWindowsClass(HINSTANCE hInstance)  //定义窗口类
{
WNDCLASS WndClass;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,"END");
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=WndProc;
WndClass.lpszClassName="WinFill";
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW|CS_VREDRAW;
return RegisterClass(&WndClass);
}

解决方案 »

  1.   

    你的编程思路不对
    gui的编程思想是把所有的画图操作都集中在WM_PAINT消息里完成
    比如,你可以设两个标志,点击左键对一个标志置位,点击右键对另一个标志置位。
    然后用InvalidRect产生一个WM_PAINT消息,在处理这个消息时依据这两个标志来画图
      

  2.   

    另logdzc,可否详细解释下标志置位的具体操作。我实现起来还是有些问题。期待.....