一个win32 SDK的程序

smlboy2009 2005-07-25 10:51:47
下面是一个win32 SDK的程序,就是画几个图
#include<windows.h>
#include<stdlib.h>
#include<string.h>
long WINAPI WndProc(HWND hWnd,UINT Message,UINT wParam,LONG lParam);
bool InitWindowsClass(HINSTANCE hInstance);
bool InitWindows(HINSTANCE hInstance);
bool InitWindows(HINSTANCE hInstance, int nCmdShow);

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 Message,
UINT wParam,
LONG lParam)
{
HDC hDC;
HBRUSH hBrush;
HPEN hPen;
PAINTSTRUCT PtStr;

switch(Message)
{
case WM_PAINT:
hDC=BeginPaint(hWnd,&PtStr);
SetMapMode(hDC,MM_ANISOTROPIC);
hPen=(HPEN)GetStockObject(BLACK_PEN);
hBrush=(HBRUSH)GetStockObject(DKGRAY_BRUSH);
SelectObject(hDC,hBrush);
SelectObject(hDC,hPen);
RoundRect(hDC,50,120,100,200,15,15);
hBrush=(HBRUSH)GetStockObject(LTGRAY_BRUSH);
SelectObject(hDC,hBrush);
Ellipse(hDC,150,50,200,150);
hBrush=(HBRUSH)GetStockObject(HOLLOW_BRUSH);
SelectObject(hDC,hBrush);
Pie(hDC,250,50,300,100,250,50,300,50);
EndPaint(hWnd,&PtStr);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0 ;
default:
return(DefWindowProc(hWnd,Message,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;
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);

}

我想问的问题是,在WndProc中有switch(Message)这个过程,而且按照结果可以知道,它的WM_PAINT是已经触发了的消息事件,因为我们已经得到了图形。我就想问,通篇只有MSG Message(定义)时涉及到了Message这个变量,后来是怎么Message=WM_PAINT的?

能不能告诉我怎么在debug的时候跟踪Message这个变量?我可以看看它到底是什么时候变的
...全文
157 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
AntonlioX 2005-07-26
  • 打赏
  • 举报
回复
还是需要看看书的 补充一下基础知识
李马 2005-07-26
  • 打赏
  • 举报
回复
来晚了,贴个地址吧
http://home.nuc.edu.cn/~titilima/download/pwchs.zip
handsomerun 2005-07-26
  • 打赏
  • 举报
回复
呵呵,偶也想找,你去google搜一把吧,可能会找到
主要是看上半册就可以了

还有下半册的后面,第三部分就可以了
linestyle 2005-07-26
  • 打赏
  • 举报
回复
《windows程序设计》

北京大学出版的,原作者是Charles Petzold的
,网上有电子的,太贵了,没有必要买:)
smlboy2009 2005-07-26
  • 打赏
  • 举报
回复
谁能给个《windows程序设计》的下载地址,北京大学出版的,原作者是Charles Petzold的

,我把分全给他!
PDD123 2005-07-26
  • 打赏
  • 举报
回复
大胆假设,认真求证
wshcdr 2005-07-26
  • 打赏
  • 举报
回复
回复人: surstar(断水流www.uisoft.net准备出本诗集叫《执着》售价13.1)
//////////////////////
敢问这位兄台,为什么《执着》卖13.1?
surstar 2005-07-26
  • 打赏
  • 举报
回复
第一楼那位热心兄弟说得很好了
老夏Max 2005-07-26
  • 打赏
  • 举报
回复
《Windows程序设计》看看吧,没有人能将这些基础的知识一次性的告诉你。一些东西如果没有基础,那么编程只是空中楼阁!!
zh1369 2005-07-26
  • 打赏
  • 举报
回复
titilima(李马)(titilima.yeah.net) ( ) 信誉:120
-----------------------------------------------
谢谢!!!
handsomerun 2005-07-25
  • 打赏
  • 举报
回复
看到楼主问了好多关于sdk的问题
楼主可以去找一本书
《windows程序设计》

北京大学出版的,原作者是Charles Petzold的

呵呵

非常好的,我想对你会有非常大的帮助的
handsomerun 2005-07-25
  • 打赏
  • 举报
回复
Windows为每个正在运行的应用程序都保持一个消息队列。当你按下鼠标或者键盘时,Windows并不是把这个输入事件直接送给应用程序,而是将输入的事件先翻译成一个消息,然后把这个消息放入到这个应用程序的消息队列中去。应用程序又是怎么来接收这个消息呢?这就讲讲消息循环了。

应用程序的WinMain函数通过执行一段代码从她的队列中来检索Windows送往她的消息。然后WinMain就把这些消息分配给相应的窗口函数以便处理它们,这段代码是一段循环代码,故称为"消息循环"。这段循环代码是什么呢?好,往下看:


MSG msg; //定义消息名

while (GetMessage (&msg, NULL, 0, 0))

{

TranslateMessage (&msg) ; //翻译消息

DispatchMessage (&msg) ; //撤去消息

}

return msg.wParam ;

GetMessage(&msg,NULL,0,0),第一个参数是要接收消息的MSG结构的地址,第二个参数表示窗口句柄,NULL则表示要获取该应用程序创建的所有窗口的消息;第三,四参数指定消息范围。后面三个参数被设置为默认值,这就是说你打算接收发送到属于这个应用程序的任何一个窗口的所有消息。在接收到除WM_QUIT之外的任何一个消息后,GetMessage()都返回TRUE。如果GetMessage收到一个WM_QUIT消息,则返回FALSE,如收到其他消息,则返回TRUE。因此,在接收到WM_QUIT之前,带有GetMessage()的消息循环可以一直循环下去。只有当收到的消息是WM_QUIT时,GetMessage才返回FALSE,结束消息循环,从而终止应用程序。 均为NULL时就表示获取所有消息。

消息用GetMessage读入后(注意这个消息可不是WM_QUIT消息),它首先要经过函数TranslateMessage()进行翻译,这个函数会转换成一些键盘消息,它检索匹配的WM_KEYDOWN和WM_KEYUP消息,并为窗口产生相应的ASCII字符消息(WM_CHAR),它包含指定键的ANSI字符.但对大多数消息来说它并不起什么作用,所以现在没有必要考虑它。

下一个函数调用DispatchMessage()要求Windows将消息传送给在MSG结构中为窗口所指定的窗口过程。我们在讲到登记窗口类时曾提到过,登记窗口类时,我们曾指定Windows把函数WindosProc作为咱们这个窗口的窗口过程(就是指处理这个消息的东东)。就是说,Windows会调用函数WindowsProc()来处理这个消息。在WindowProc()处理完消息后,代码又循环到开始去接收另一个消息,这样就完成了一个消息循环。

handsomerun 2005-07-25
  • 打赏
  • 举报
回复
你可以在switch(Message)处设置断点
看得到的是什么消息

在while(GetMessage(&Message,0,0,0))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}

这个地方,系统会收到消息(比如这里是WM_PAINT),然后通过上述代码,把消息传递给WndProc

在WndProc中根据消息的不同做不同的处理

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧