简单窗口绘图程序刷新问题
请看下面的Windows简易绘图程序一部分:draw()是绘图函数
我在消息处理中加入case WM_LBUTTONDOWN:当按下鼠标左键时,应该执行它之下的语句,我发现number++执行了,但draw()似乎没执行,因为如果执行了draw()我应该看到图形的变化,draw()函数前面有绘制一个大的白色正方形,作用类似清屏。如果我拽着程序窗口到边界,让窗口大部分到达显示器边界外,然后拽回来则发现图形变了。按我的理解,应该按下鼠标键图形就变化,可为什么没变化呢?如果想按下鼠标键就让图形变化应该怎么编程呢?怎么刷新窗口呢?期待专家解答!
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)//窗口函数说明
{
switch(message)//处理消息
{
case WM_LBUTTONDOWN:
number+=10;
draw();
break;
case WM_RBUTTONDOWN:
number-=10;
draw();
break;
case WM_PAINT://处理绘图消息
draw();
break;
case WM_DESTROY://消除窗口时由DestroyWindow函数发出此消息
PostQuitMessage(0);//向应用程序发出WM_QUIT消息,请求退出
break;
default://对未定义的消息提供默认处理
return(DefWindowProc(hwnd,message,wParam,lParam));
//DefWindowProc是系统默认的处理过程
}return 0;
}
void draw()
{
HDC hDC;//定义指向设备上下文的句柄
HBRUSH hb1,hb2;//定义指向画刷的句柄
PAINTSTRUCT PtStr;//定义指向包含绘图信息的结构体变量
HPEN hPen;//定义指向画笔的句柄
hDC=BeginPaint(hwnd,&PtStr);
SetMapMode(hDC,nMode);//设置映射模式
hPen=(HPEN)GetStockObject(WHITE_PEN);//设置画笔为系统预定义的白色画笔
hb1=(HBRUSH)GetStockObject(WHITE_BRUSH);//白色画刷
SelectObject(hDC,hb1);//选择画刷
SelectObject(hDC,hPen);//选择画笔
Rectangle(hDC,0,0,1000,1000);
hPen=(HPEN)GetStockObject(BLACK_PEN);//设置画笔为系统预定义的黑色画笔
hb1=(HBRUSH)GetStockObject(DKGRAY_BRUSH);//深灰色画刷
SelectObject(hDC,hb1);//选择画刷
SelectObject(hDC,hPen);//选择画笔
RoundRect(hDC,9,120,number,200,15,15);//圆角矩形
hb2=(HBRUSH)GetStockObject(LTGRAY_BRUSH);//淡灰色画刷
SelectObject(hDC,hb2);//选择画刷
Ellipse(hDC,150,50,200,150);//椭圆
hb1=(HBRUSH)GetStockObject(HOLLOW_BRUSH);//采用系统预定义的虚画刷
SelectObject(hDC,hb1);//选择画刷
Pie(hDC,250,50,300,100,250,50,300,50);//饼形
EndPaint(hwnd,&PtStr);//结束绘图
}
该程序的全部源程序:
#include<windows.h>//包含基本数据类型定义
#include<stdlib.h> //数学函数库
#include<string.h> //数学函数库
#include<stdio.h>//输入输出库
int nMode;
int number=0;
void draw();
HWND hwnd;
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//窗口函数说明
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) // 入口函数
{
MSG Msg; //MSG为消息结构体变量类型 Message为变量名,可为Msg
WNDCLASS wndclass;
char lpszClassName[]="映射模式";
char lpszTitle[]="LTL Programe";
wndclass.style=0;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=lpszClassName;
if(!RegisterClass(&wndclass))
{
MessageBeep(0);
return FALSE;
}
hwnd=CreateWindow
(
lpszClassName,//窗口实例的标题名
lpszTitle,//窗口的风格
WS_OVERLAPPEDWINDOW,//
CW_USEDEFAULT,//窗口左上角坐标为默认值
CW_USEDEFAULT,//
CW_USEDEFAULT,//窗口的高和宽为默认值
CW_USEDEFAULT,
NULL,//此窗口无父窗口
NULL,//此窗口无主菜单
hInstance,//创建此窗口应用程序的当前句柄
NULL//不使用该值
);
ShowWindow(hwnd,nCmdShow);//显示窗口
UpdateWindow(hwnd);//绘制用户区
while(GetMessage(&Msg,0,0,0))//消息循环
//后两个参数为0不过滤消息
{//GetMessage是从消息队列中提取一条消息,并将消息放到MSG结构体
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)//窗口函数说明
{
switch(message)//处理消息
{
case WM_LBUTTONDOWN:
number+=10;
draw();
break;
case WM_RBUTTONDOWN:
number-=10;
draw();
break;
case WM_PAINT://处理绘图消息
draw();
break;
case WM_DESTROY://消除窗口时由DestroyWindow函数发出此消息
PostQuitMessage(0);//向应用程序发出WM_QUIT消息,请求退出
break;
default://对未定义的消息提供默认处理
return(DefWindowProc(hwnd,message,wParam,lParam));
//DefWindowProc是系统默认的处理过程
}return 0;
}
void draw()
{
HDC hDC;//定义指向设备上下文的句柄
HBRUSH hb1,hb2;//定义指向画刷的句柄
PAINTSTRUCT PtStr;//定义指向包含绘图信息的结构体变量
HPEN hPen;//定义指向画笔的句柄
hDC=BeginPaint(hwnd,&PtStr);
SetMapMode(hDC,nMode);//设置映射模式
hPen=(HPEN)GetStockObject(WHITE_PEN);//设置画笔为系统预定义的白色画笔
hb1=(HBRUSH)GetStockObject(WHITE_BRUSH);//白色画刷
SelectObject(hDC,hb1);//选择画刷
SelectObject(hDC,hPen);//选择画笔
Rectangle(hDC,0,0,1000,1000);
hPen=(HPEN)GetStockObject(BLACK_PEN);//设置画笔为系统预定义的黑色画笔
hb1=(HBRUSH)GetStockObject(DKGRAY_BRUSH);//深灰色画刷
SelectObject(hDC,hb1);//选择画刷
SelectObject(hDC,hPen);//选择画笔
RoundRect(hDC,9,120,number,200,15,15);//圆角矩形
hb2=(HBRUSH)GetStockObject(LTGRAY_BRUSH);//淡灰色画刷
SelectObject(hDC,hb2);//选择画刷
Ellipse(hDC,150,50,200,150);//椭圆
hb1=(HBRUSH)GetStockObject(HOLLOW_BRUSH);//采用系统预定义的虚画刷
SelectObject(hDC,hb1);//选择画刷
Pie(hDC,250,50,300,100,250,50,300,50);//饼形
EndPaint(hwnd,&PtStr);//结束绘图
}