吵吵   2012-04-14  阅读:3,219

MFC封装的窗口提供了一个很好的消息宏来控制消息的流通,使得消息能够很好的到达我们所需要的地方,而如果你要用sdk来开发的话,你需要做的工作就是完成这样子的一个架构。使用sdk当然是有些好处,比如原本这么大的一个窗口类,被你变的那么小,那么少了,能少保存多少指针和变量,使我们的程序更加简洁。

首先我们讨论的是建立主窗口的办法,即我们用sdk建立的窗口是该程序的第一个窗口,这样我们要做的工作风别如下:

1、建立主函数winmain();

2、注册窗口类;

3、实例化窗口,即建立我们的窗口;

4、使用while做一个消息循环。

5、最后如果需要处理消息的话,建立的就是winPro函数了。

以上的代码网上一抓就是一大把,我们就不再讨论和复述了。今天我们想了解的是,如果我们已经建立了一个主窗口了,然后再需要建立一个子窗口类,如用来做一些消息的提示框,我们需要怎么做?

说来也简单,就是少了上边的建立主函数和做消息循环两个步骤罢了。

1、注册窗口类:

bool ChaoShadow::Initialize(HINSTANCE hInstance)
{
s_hInstance = hInstance;

// Register window class for shadow window
WNDCLASSEX wcex;

memset(&wcex, 0, sizeof(wcex));

wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = ChaoProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = _T("ChaoShadow");
wcex.hIconSm = NULL;

RegisterClassEx(&wcex);

return true;
}

2、创建窗口:

void ChaoShadow::Create(HWND hParentWnd)
{
m_hWnd = CreateWindowEx(/*WS_EX_LAYERED | WS_EX_TRANSPARENT*/NULL, _T("ChaoShadow"), NULL,
WS_VISIBLE | WS_CAPTION | WS_POPUPWINDOW ,
CW_USEDEFAULT, 200, 300, 400, hParentWnd, NULL, s_hInstance, NULL);
}

3、建立窗口消息处理函数:

LRESULT CALLBACK ChaoShadow::ChaoProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{

switch(uMsg)
{
case WM_LBUTTONDOWN:
AfxMessageBox(_T("ss"));
break;
}
return ::DefWindowProc(hwnd,uMsg,wParam,lParam);
}

这个函数的使用值得一聊,这个回调函数在注册窗口类的时候就已经指定了,窗口的消息也会流通到这里来。如果当初不是指定用chaopro()函数的话,那么就用缺省的消息处理函数defWinProc,这样子就无法响应消息了。而当我们指定之后,在处理完消息之后依旧要返回到缺省消息处理函数中去,否则消息的流通就受阻了,关闭窗口等消息无法响应了,这大概也有点像是个虚函数了。

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

2条回应:“sdk创建子窗口及其消息的捕获”

  1. 蓝色幽思说道:

    不错不错…我喜欢这文章…
    欢迎回访哦~~
    欢迎加友情链接….做好连接后,去我的留言板留言就可以啦~我会很快给您加上哦。。。
    http://www.lanseyousi.com

  2. 水草浪子说道:

    浪子是个编程盲·········泪奔~~

发表评论

电子邮件地址不会被公开。 必填项已用*标注