窗体创建情形汇总

 

1. 采用SDK方式创建窗体

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

#define MAIN_CLASS "TESTMAIN"

ATOM MyRegisterWndClass(HINSTANCE hInstance, DWORD dwIcon)
{
WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = sizeof(LONG);
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(dwIcon));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = MAIN_CLASS;
wcex.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(dwIcon));

return RegisterClassEx(&wcex);
}

{
MyRegisterWndClass(AfxGetInstanceHandle(), 0);

HWND hWnd = CreateWindow(MAIN_CLASS,
        MAIN_CLASS,
        WS_OVERLAPPEDWINDOW,
        100,
        100,
        400,
        300,
        NULL,
        NULL,
        ::AfxGetInstanceHandle(),
        //hInstance,
        NULL);
::ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
}

2. 采用MFC CWnd方法来创建窗体
   CWnd方法是对API方法的封装,由于封装得并不深,我们仍然可以清晰地看到其对应关系
   如 AfxRegisterWndClass() 对应 RegisterClassEx()
   CWnd::CreateEx() 对应 CreateWindow()

CString strClass = AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW);
g_pWnd->CreateEx(0, strClass, "test caption", WS_BORDER|WS_VISIBLE, CRect(100, 100,150,120), NULL, 0, 0);

3. 子窗体的创建 Create 和 CreateEx

通常我们在制作对话框时,由于MFC基类已经帮我们创建好了子窗体(控件),所以我们不用花费心力在
底层建筑工作上,然而,我们明白所以然能使我们加深对了窗体的认识。

CButton *pButton = new CButton;
pButton->Create("But1", BS_PUSHBUTTON|WS_VISIBLE, CRect(0, 0, 100, 50), this, 1001);

pButton->CreateEx("But1", "Button", BS_PUSHBUTTON|WS_VISIBLE|WS_CHILD, CRect(0, 0, 100, 50), this, 1001);
请注意两种用法的区别:
Create() 仅适合于创建子窗体的情形
CreateEx 适合于适合于创建所有窗体情形,但必须明确指定 窗体类,或者自己注册一个类
而且,创建子窗体必须指定子窗体ID

4. 线程内创建窗体
以前一直不明白为什么线程内不能创建窗体,参考了网上很多资料,都说存在创建了闪一下就消失的情况,
也有的网友说要用CreateWindow() SDK方式来创建,其实SDK方式和MFC方式完全相同,几经周折,我终于
发现窗口消失的秘密,那就是工作线程消息循环及线程存贮

线程是窗口的载体,也是窗口运转的动力,线程结束,窗口就消失,窗口的消息循环,也需要线程来派发

DWORD WINAPI WinThread(LPVOID _lp)
{
g_pWnd = new CWnd();

CString strClass = AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW);

g_pWnd->CreateEx(0, strClass, "But1", CS_VREDRAW | CS_HREDRAW|WS_BORDER|WS_VISIBLE, CRect(100, 100,150,120), NULL, 0, 0);

MSG msg;
while (GetMessage(&msg, NULL, 0, 0))   //线程将产生消息队列
{
   TranslateMessage(&msg);
   DispatchMessage(&msg);
}

return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值