• 走进windows编程的世界-----窗体的注冊及创建


    1   窗体注冊和创建

    1.1WIN32 窗体程序创建步骤

    1、WinMain入口函数的定义

    2、WindowProc函数的定义

    3、注冊窗体类

    RegisterClass、RegisterClassEX

    4、创建窗体

    CreateWindow、CreateWindowEx

    HWND CreateWindow(    

        LPCTSTRlpClassName,//指向已注冊的窗体类的名称的指针

        LPCTSTRlpWindowName,//指向窗体名称的指针

        DWORDdwStyle,//窗体的风格

        intx,//窗体位置的X坐标

        inty,//窗体位置的Y坐标

        intnWidth,//窗体的宽度

        intnHeight,//窗体的高度

        HWNDhWndParent,//父窗体的句柄

        HMENUhMenu,//窗体菜单句柄

        HINSTANCEhInstance,//应用程序使用句柄

        LPVOIDlpParam//应用程序数据区句柄

    );

    參数:

    lpClassName

    一个指向以零结尾的字符串的指针。或者指向曾经由RegisterClassRegisterClassEx条用创建的原子的指针。这个原子必须是次參数的低位。高位必须是0。假设是一个字符串,它指定窗体类的名称。类名能够是用RegisterClassRegisterClassEx注冊过的不论什么名称。providedthat themodule that registers the class is also the module thatcreates the window.类名称也能够是不论什么提前定义的系统类名称。

    lpWindowName

    指向指定窗体名称的以零结尾的字符串的指针。

    假设窗体的风格指定了一个标题栏,则它将会显示在标题栏上。当使用CreateWindow创建控件时,此參数指定控件的文字。当用SS_ICON风格创建static控件时。此參数指定图标的名称或者标识符。要指定一个标识符。使用”#num”语法。

    dwStyle

    指定要创建窗体的风格。

    能够是窗体风格的组合,加上控件的风格的组合。

    x

    指定窗体的初始水平位置。

    对于overlapped或者弹出式窗体。x參数是初始的x坐标相当窗体的左上角,在屏幕坐标系上。Fora childwindow, x is the x-coordinate of the upper-left corner ofthe window relative tothe upper-left corner of the parent window'sclientarea.假设參数值被设置为CW_USEDEFAULT,系统为窗体左上角选择默认的位置并忽略y參数。CW_USEDEFAULT仅对overlapped窗体有效,假设它在弹出窗体或者自窗体上被指定。则xy參数被设置为零。

    y

    指定窗体的初始化垂直位置。

    对于交叠式窗体或者弹出式窗体,y參数是在屏幕坐标上初始的窗体左上角的y坐标。

    对于子窗体。y是和父窗体客户区左上角相关的初始子窗体左上角的y坐标。

    对于listbox控件。y是和父窗体客户区左上角相关的listbox客户区初始的左上角的y坐标。

    假设用WS_VISIBLE风格创建一个overlapped窗体而且x參数设置为CW_USEDEFAULT,系统忽略y參数。

    nWidth

    用设备单位指定窗体的宽度。对于overlapped窗体,nWidth參数既能够是在屏幕坐标上窗体的宽度。也能够是CW_USEDEFAULT.假设nWidthCW_USEDEFAULT,系统选择一个默认的宽度和高度。这个默认的宽度从初始的x坐标到屏幕的右边缘。默认的高度从y坐标到图标区的顶端。

    CW_USEDEFAULT仅对overlapped窗体可用,假设对子窗体或者弹出窗体设置了CW_USEDEFAULT,则nWidthnHeight被设置为0

    nHeight

    指定窗体的高度用设备单位。

    对于overlapped窗体,nHeight是在屏幕坐标上窗体的高度。

    假设nWidth被设置为CW_USEDEFAULT,系统忽略nHeight

     

    hWndParent

    指向被创建窗体的父窗体或者全部者窗体的句柄。要创建一个子窗体或者一个被全部的窗体,提供一个有效的窗体句柄。

    这个參数对于弹出式窗体是可选的。

    hMenu

    菜单句柄,或者指定一个依靠窗体风格的子窗体标识符。

    对于overlapped窗体或者弹出式窗体,hMenu识别窗体要使用的菜单。能够是NULL假设使用类的菜单。对于子窗体。hMenu指定自窗体的标识符,一个用来通知父窗体对话框控件的事件的整数。程序决定子窗体的标识,他对于同样父窗体的全部子窗体必须是唯一的。

    hInstance

    Windows95/98/Me: 和这个窗体有关系的模块的实例句柄。

    WindowsNT/2000/XP: 此值被忽略。

    lpParam

    [in]Pointer to a value to be passed to the window through theCREATESTRUCT structurepassed in the lpParam parameter theWM_CREATE message. 假设一个程序通过调用CreateWindow创建多文档界面的客户窗体。

    lpParam必须指向一个CLIENTCREATESTRUCT结构。


    5、窗体的显示和刷新

    ShowWindow、 UpdateWindow

    6、消息处理

    GetMessage、 DispatchMessage

    7、窗体退出

    WM_DESTROY、

    1.2窗体的注冊

    1.2.1窗体类的分类

    1、  系统全局窗体类,比方按钮(BUTTOn),文本编辑框(EDITed)等

    2、  应用程序的全局窗体类。能够在一个应用程序中EXE、DLL等全部模块中使用的窗体类。

    3、  局部窗体类。

    仅仅能在本模块中使用的窗体类。

    1.2.2实现窗体类的注冊

    1、  系统全局的窗体类。无需注冊直接使用

    使用CreateWindow函数,在CLASSNAME中指定系统已经定义好的窗体类型名称就可以。

    以下创建一个BUtton或者EDIt窗体

    /*File : botton.cpp
     *Auth : sjin
     *Date : 20140618
     *Mail : 413977243@qq.com
     */
    
    /*窗体的创建的练习*/
    
    #include <Windows.h>
    #include <WinNT.h>
    
    HINSTANCE g_hInst = NULL; 
    
    /*窗体处理函数*/
    LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM iParam)
    {
    	return DefWindowProc(hWnd,nMsg,wParam,iParam);
    }
    
    /*创建BUTTON*/
    HWND CreateButton()
    {
    
    	/*BUTTOn */
    #if 0
    	HWND hWnd = CreateWindow(
    		"BUTTON","My first button test",
    		WS_OVERLAPPEDWINDOW,0,0,100,150,
    		NULL,NULL,g_hInst,NULL);
    #else
    	HWND hWnd = CreateWindow(
    		"EDIT","My first button test",
    		WS_OVERLAPPEDWINDOW,0,0,100,150,
    		NULL,NULL,g_hInst,NULL);
    #endif
    	return hWnd;
    }
    
    /*注冊*/
    
    BOOL RegisterWnd(LPSTR pszClassName)
    {
    	WNDCLASSEX hWnd = {''};
    
    	hWnd.cbSize = sizeof(hWnd);
    	hWnd.style  = CS_VREDRAW | CS_HREDRAW;
    	hWnd.lpfnWndProc = WndProc;
    	hWnd.cbClsExtra = 0;
    	hWnd.cbWndExtra = 0;
    	hWnd.hCursor = NULL;
    	hWnd.hIcon = NULL;
    	hWnd.hbrBackground = HBRUSH(COLOR_BTNFACE +1);
    	hWnd.lpszClassName = pszClassName;
    	hWnd.hInstance = g_hInst;
    
    	ATOM  nAtom = RegisterClassEx(&hWnd);
    
    	if( 0 == nAtom) {
    		return FALSE;
    	}
    	return TRUE;
    
    }
    
    /*显示窗体*/
    
    void DisplayButton(HWND hwnd)
    {
    	ShowWindow(hwnd,SW_SHOW);
    	UpdateWindow(hwnd);
    }
    
    
    void Message()
    {
    	MSG msg = {0};
    
    	while(GetMessage(&msg,NULL,0,0)){
    		/*文本框可输入*/
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    }
    
    /*入口函数*/
    int WINAPI WinMain(HINSTANCE hInst,
    				HINSTANCE  hPrevInst,
    				LPSTR  pszCmcLine,
    				int nShowCmd)
    {
    	g_hInst = hInst;
    
    	HWND hwnd = CreateButton();
    
    	RegisterWnd("");
    	DisplayButton(hwnd);
    
    	Message();
    	return 0;
    }


    2、  应用程序全局窗体类,须要用代码实现注冊。在注冊时须要添加CS_CLOBALCLASS(各个模块中都能够使用的)定义的实现方式:

    WNDCLASS wc = {''};

    wc.style          = CS_CLOBALCLASS |CS_HREARAW;

    RegisterClass(&wc);

    以下的样例基本都是一样的

    3、  局部窗体类。不是添加CS_CLOBALCLASS定义

    使用RegisterClass、RegisterClassEX来注冊

    /*File : winreg.cpp
     *Auth : sjin
     *Date : 20140619
     *Mail : 413977243@qq.com
     */
    
    /*窗体的创建的练习*/
    
    #include <Windows.h>
    #include <WinNT.h>
    
    HINSTANCE g_hInst = NULL; 
    
    /*窗体处理函数*/
    LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM iParam)
    {
    	return DefWindowProc(hWnd,nMsg,wParam,iParam);
    }
    
    /*创建window*/
    HWND Createwindow(LPSTR pszClassName)
    {
    
    	HWND hWnd = CreateWindow(
    		pszClassName,"My first wondow test",
    		WS_OVERLAPPEDWINDOW,0,0,100,150,
    		NULL,NULL,g_hInst,NULL);
    	return hWnd;
    }
    
    /*注冊*/
    
    BOOL RegisterWnd(LPSTR pszClassName)
    {
    	WNDCLASSEX hWnd = {''};
    
    	hWnd.cbSize = sizeof(hWnd);
    	hWnd.style  = CS_VREDRAW | CS_HREDRAW;
    	hWnd.lpfnWndProc = WndProc;
    	hWnd.cbClsExtra = 0;
    	hWnd.cbWndExtra = 0;
    	hWnd.hCursor = NULL;
    	hWnd.hIcon = NULL;
    	hWnd.hbrBackground = HBRUSH(COLOR_BTNFACE +1);
    	hWnd.lpszClassName = pszClassName;
    	hWnd.hInstance = g_hInst;
    
    	ATOM  nAtom = RegisterClassEx(&hWnd);
    
    	if( 0 == nAtom) {
    		return FALSE;
    	}
    	return TRUE;
    
    }
    
    /*显示窗体*/
    
    void DisplayWnd(HWND hwnd)
    {
    	ShowWindow(hwnd,SW_SHOW);
    	UpdateWindow(hwnd);
    }
    
    
    void Message()
    {
    	MSG msg = {0};
    
    	while(GetMessage(&msg,NULL,0,0)){
    		/*文本框可输入*/
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    }
    
    /*入口函数*/
    int WINAPI WinMain(HINSTANCE hInst,
    				HINSTANCE  hPrevInst,
    				LPSTR  pszCmcLine,
    				int nShowCmd)
    {
    	g_hInst = hInst;
    
    	RegisterWnd("MYWIN");
    
    	HWND hwnd = Createwindow("MYWIN");
    
    	
    	DisplayWnd(hwnd);
    
    	Message();
    	return 0;
    }

    注:上面程序中存在一个问题。就是程序关闭后,并没有全然退出,还在后台执行。问了解决问题,须要在窗体处理函数做以下的改动:

    /*窗体处理函数*/
    LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM iParam)
    {
    	switch(nMsg){
    	case WM_DESTROY:
    		/*添加这个程序能够正常的退出*/
    		PostQuitMessage(0);
    		break;
    	}
    	return DefWindowProc(hWnd,nMsg,wParam,iParam);
    }

    1.1.1窗体类风格

    CS_HREDRAW 窗体水平变化,又一次绘制窗体。

    CS_VREDRAW 窗体垂直变化。又一次绘制窗体。

    CS_DBCLICK 窗体能够接收鼠标双击消息

    CS_GLOBALCLASS 创建应用程序全局窗体类。

    CS_BYTEALIGNWINDOW 窗体对齐方式,以8的倍数对齐

    CS_BYTEALIGNCLIENT 窗体客户区对齐方式,以8的倍数对齐

     CS_CLASSDC 全部这样的类型的窗体使用同一个DC(设备描写叙述表,画图使用)

     CS_OWNDC 每一个窗体拥有自己的DC

    CS_PARENTDC 使用父窗体的DC

                CS_SAVEBITS是用位图保存窗体界面,能够提高窗体界面的刷新性能CS_NOCLOSE 禁止关闭命令

    1.1.2窗体类的附加数据 cbClsExtra

    在窗体类的数据信息中能够加入自己的信息

    cbClsExtra 用于加入信息的内存的大小。

    SetClassLong 将信息保存到内存中

    GetClassLong 将信息从内存中取出

    1.1.3窗体附加数据cbWndExtra

    在窗体的数据信息中能够加入自己的信息

    cbWndExtra 用于加入信息的内存的大小。

    SetWindowLong 将信息保存到内存中

    GetWindowLong 将信息从内存中取出

    以下代码演示样例:

    /*File : winreg.cpp
     *Auth : sjin
     *Date : 20140619
     *Mail : 413977243@qq.com
     */
    
    /*窗体的创建的练习*/
    
    #include <Windows.h>
    #include <WinNT.h>
    #include <stdio.h>
    
    HINSTANCE g_hInst = NULL; 
    
    /*窗体处理函数*/
    LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM iParam)
    {
    	switch(nMsg){
    	case WM_DESTROY:
    		/*添加这个程序能够正常的退出*/
    		PostQuitMessage(0);
    		break;
    	}
    	return DefWindowProc(hWnd,nMsg,wParam,iParam);
    }
    
    /*创建window*/
    HWND Createwindow(LPSTR pszClassName)
    {
    
    	HWND hWnd = CreateWindow(
    		pszClassName,"My first wondow test",
    		WS_OVERLAPPEDWINDOW,0,0,100,150,
    		NULL,NULL,g_hInst,NULL);
    	return hWnd;
    }
    
    /*注冊*/
    
    BOOL RegisterWnd(LPSTR pszClassName)
    {
    	WNDCLASSEX hWnd = {''};
    
    	hWnd.cbSize = sizeof(hWnd);
    	/*
         * 
         *CS_HREDRAW 窗体水平变化。又一次绘制窗体。
         *CS_VREDRAW 窗体垂直变化。又一次绘制窗体。

    *CS_DBCLICK 窗体能够接收鼠标双击消息 *CS_GLOBALCLASS 创建应用程序全局窗体类。 *CS_BYTEALIGNWINDOW 窗体对齐方式,以8的倍数对齐 *CS_BYTEALIGNCLIENT 窗体客户区对齐方式,以8的倍数对齐 *CS_CLASSDC 全部这样的类型的窗体使用同一个DC(设备描写叙述表,画图使用) *CS_OWNDC 每一个窗体拥有自己的DC *CS_PARENTDC 使用父窗体的DC *CS_SAVEBITS 是用位图保存窗体界面,能够提高窗体界面的刷新性能 *CS_NOCLOSE 禁止关闭命令. */ hWnd.style = CS_VREDRAW | CS_HREDRAW; hWnd.lpfnWndProc = WndProc; hWnd.cbClsExtra = 100; hWnd.cbWndExtra = 100; hWnd.hCursor = NULL; hWnd.hIcon = NULL; hWnd.hbrBackground = HBRUSH(COLOR_BTNFACE +1); hWnd.lpszClassName = pszClassName; hWnd.hInstance = g_hInst; ATOM nAtom = RegisterClassEx(&hWnd); if( 0 == nAtom) { return FALSE; } return TRUE; } /*显示窗体*/ void DisplayWnd(HWND hwnd) { ShowWindow(hwnd,SW_SHOW); UpdateWindow(hwnd); } void Message() { MSG msg = {0}; while(GetMessage(&msg,NULL,0,0)){ /*文本框可输入*/ TranslateMessage(&msg); DispatchMessage(&msg); } } /*设置附加数据*/ void SetExtra(HWND hWnd) { SetClassLong(hWnd,1,100); SetWindowLong(hWnd,1,200); } /*获取附加数据*/ void GetExtra(HWND hWnd) { DWORD nClass = GetClassLong(hWnd,1); DWORD nWnd = GetWindowLong(hWnd,1); char szText[256]= {0}; sprintf(szText,"CLS:%d WND:%d",nClass,nWnd); MessageBox(NULL,szText,"EXTRA",MB_OK); } /*入口函数*/ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pszCmcLine, int nShowCmd) { g_hInst = hInst; RegisterWnd("MYWIN"); HWND hwnd = Createwindow("MYWIN"); HWND hwnd2 = Createwindow("MYWIN"); SetExtra(hwnd); GetExtra(hwnd); GetExtra(hwnd2); DisplayWnd(hwnd); Message(); return 0; }



    1.1创建窗体

    1.1.1窗体创建函数

    CreateWindow/CreateWindowEx

          HWND CreateWindowEx(

                      DWORD dwExStyle,//窗体的扩展样式

                      LPCTSTR lpClassName,  // pointer to registered class name

                      LPCTSTR lpWindowName, //pointer to window name

                      DWORD dwStyle,        // window style

                      int x,                // horizontal position ofwindow

                      int y,                // vertical position of window

                      int nWidth,           // window width

                      int nHeight,          // window height

                      HWND hWndParent,      // handle to parent or owner window

                      HMENU hMenu,          // handle to menu, or child-windowidentifier

                      HINSTANCE hInstance,  // handle to application instance

                      LPVOID lpParam );     // pointer to window-creation data

    1.1.2窗体的风格及扩展风格

     窗体风格: WS_XXXX定义的风格,是窗体的基本风格.

     扩展风格:WS_EX_XXXXX 定义的风格,是窗体的扩展风格.比方: ToolWindow窗体等等。

     在CreateWindow能够使用基本窗体风格,扩展的窗体风格,须要使用CreateWindowEx设置.    
     WS_OVERLAPPED窗体,层叠式窗体
       WS_POPUP窗体,弹出式窗体
       WS_CHILD窗体,子窗体

    1.1.3子窗体和父窗体

    CreateWindow时,指定父窗体

    将窗体的风格添加WS_CHILD      

    能够使用SetParent和GetParent函数设置和获取指定窗体的父窗体.

    其它: MoveWindow 移动窗体

    以下是关于父子窗体的演示样例

    /* File : createWindow.cpp
     * Auth : sjin
     * Date : 20140623
     * Mail : 413977243@qq.com
     */
    
    #include <Windows.h>
    #include <stdio.h>
    
    HINSTANCE g_hInst = NULL;
    
    /*父窗体处理函数*/
    LRESULT CALLBACK WndProc(HWND hWnd, UINT nMsg, 
                             WPARAM wParam, LPARAM lParam)
    {
        switch(nMsg) {
        case WM_DESTROY: 
    		PostQuitMessage(0);
            return 0;
        }
        return DefWindowProc(hWnd, nMsg, wParam, lParam);
    }
    
    /*子窗体处理函数*/
    LRESULT CALLBACK ChildProc(HWND hWnd, UINT nMsg, 
                             WPARAM wParam, LPARAM lParam)
    {
        return DefWindowProc(hWnd, nMsg, wParam, lParam);
    }
    
    /*注冊窗体*/
    BOOL RegisterWnd(LPSTR pszClassName,WNDPROC proc,int nBrush)
    {
        WNDCLASSEX wce = {0};
        wce.cbSize = sizeof(wce);
        wce.style = CS_VREDRAW|CS_HREDRAW;
        wce.lpfnWndProc = proc;
        wce.cbClsExtra = 100;
        wce.cbWndExtra = 100;
        wce.hCursor = NULL;
        wce.hIcon = NULL;
        wce.hbrBackground = HBRUSH(nBrush);
        wce.lpszClassName = pszClassName;
        wce.lpszMenuName = NULL;
        wce.hInstance = g_hInst;
        ATOM nAtom = RegisterClassEx(&wce);
        if(0 == nAtom)
        {
            MessageBox(NULL, "registerError", "Error", MB_OK);
            return FALSE;
        }
        return TRUE;
    }
    
    /*创建窗体*/
    HWND CreateWnd(LPSTR pszClassName,HWND hParent,DWORD dwStyle)
    {
    	HWND hWnd = CreateWindowEx(
    		0,                    /*窗体扩展风格*/
    		//WS_EX_TOOLWINDOW,   /*没有扩大和隐藏按钮*/
    		//WS_EX_CLIENTEDGE | WS_EX_CONTEXTHELP,
    		//WS_EX_PALETTEWINDOW,/**/
    		pszClassName,
            "My Wnd",
    		dwStyle, 
    		CW_USEDEFAULT, 
    		CW_USEDEFAULT,
    		CW_USEDEFAULT,
    		CW_USEDEFAULT,
            hParent, NULL, g_hInst, NULL);
    
        return hWnd;
    }
    
    /*显示窗体*/
    void DisplayWnd(HWND hWnd)
    {
        ShowWindow(hWnd, SW_SHOW);
        UpdateWindow(hWnd);
    }
    
    /*消息*/
    void Message()
    {
        MSG msg = {0};
        while(GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    
    
    int WINAPI WinMain(HINSTANCE hInst,
                       HINSTANCE hPrevInt,
                       LPSTR lpCmdLine,
                       int nShowCmd)
    {
        g_hInst = hInst;
    
    	/*注冊父窗体*/
    	RegisterWnd("parent",WndProc,COLOR_BTNFACE + 1);
    
    	 /*注冊子窗体*/
    	RegisterWnd("Child",ChildProc,COLOR_WINDOW);
    	/*注冊子窗体*/
    	RegisterWnd("Child1",ChildProc,COLOR_WINDOW);
    
    	/*创建父窗体 
    	 * 注意 窗体类的名称必须和注冊时的名字一样。否则显示不了窗体
    	 */
    	HWND hMyWnd1 = CreateWnd("parent",NULL,WS_OVERLAPPEDWINDOW);
    
    	/*创建子窗体*/
    	HWND hChild = CreateWnd("Child",hMyWnd1,WS_CHILD| WS_VISIBLE|WS_BORDER|WS_THICKFRAME|WS_CAPTION|WS_SYSMENU);
    	HWND hChild1 = CreateWnd("Child1",hMyWnd1,WS_CHILD| WS_VISIBLE|WS_BORDER|WS_THICKFRAME|WS_CAPTION|WS_SYSMENU);
    
    	/*移动窗体*/
    	MoveWindow(hChild,100,100,100,100,TRUE);
    	/*移动窗体*/
    	MoveWindow(hChild1,100,200,100,100,TRUE);
    
        DisplayWnd(hMyWnd1);
    
        Message();
    
        return 0;
    }

    MDI 窗体创建

    /* File : mdiWindows.c
     * Auth : sjin
     * Date : 20140625
     * Mail : 413977243@qq.com
     */
    
    #include <Windows.h>
    #include <stdio.h>
    
    HINSTANCE g_hInst = NULL;
    HWND g_hMDIClient = NULL;
    
    /*主窗体处理函数*/
    LRESULT CALLBACK MainProc(HWND hWnd,
    	UINT nMsg,
    	WPARAM wParam,
    	LPARAM lParam)
    {
    	switch(nMsg){
    	case WM_DESTROY:
    
    		PostQuitMessage(0);
    		return 0;
    	}
    	return DefFrameProc(hWnd,g_hMDIClient,nMsg,wParam,lParam);
    }
    
    /*子窗体处理函数*/
    LRESULT CALLBACK ChildProc(HWND hWnd,
    							UINT nMsg,
    							WPARAM wParam,
    							LPARAM lParam)
    {
    
    	return DefMDIChildProc(hWnd,nMsg,wParam,lParam);
    }
    
    /*窗体注冊函数*/
    BOOL RegisterWnd(LPSTR pszClassname,
    				WNDPROC Proc,
    				int nBrush)
    {
    	WNDCLASSEX wce = {0};
    
        wce.cbSize = sizeof(wce);
        wce.style = CS_VREDRAW|CS_HREDRAW;
        wce.lpfnWndProc = Proc;
        wce.cbClsExtra = 100;
        wce.cbWndExtra = 100;
        wce.hCursor = NULL;
        wce.hIcon = NULL;
        wce.hbrBackground = HBRUSH(nBrush);
        wce.lpszClassName = pszClassname;
        wce.lpszMenuName = NULL;
        wce.hInstance = g_hInst;
    	wce.hIconSm = NULL;
    
        ATOM nAtom = RegisterClassEx(&wce);
        if(0 == nAtom)
        {
            MessageBox(NULL, "registerError", "Error", MB_OK);
            return FALSE;
        }
        return TRUE;
    }
    
    /*创建主窗体*/
    
    HWND createMainWnd(LPSTR pszClassName)
    {
    	HWND hWnd = CreateWindowEx(0,
    		pszClassName,"MainWnd",
    		WS_OVERLAPPEDWINDOW,
    		CW_USEDEFAULT,
    		CW_USEDEFAULT,
    		CW_USEDEFAULT,
    		CW_USEDEFAULT,
    		NULL,
    		NULL,
    		g_hInst,
    		NULL);
    
    	return hWnd;
    }
    
    /*创建MDICLIENT窗体*/
    
    HWND createMdiClient(HWND hParent)
    {
    	/*创建时附件的数据
    	 * MDICLIENT时必须的
    	 */
    	CLIENTCREATESTRUCT cs = {''};
    	cs.idFirstChild = 1000;/*ID号*/
    
    	HWND hWnd = CreateWindowEx(0,
    		"MDICLIENT","MainWnd",
    		WS_CHILD|WS_VISIBLE,
    		0,
    		0,
    		500,
    		500,
    		hParent,
    		NULL,
    		g_hInst,
    		&cs);
    
    	return hWnd;
    }
    
    /**/
    HWND createChildWnd(HWND hParent,LPSTR pszClassName)
    {
    	
    
    	HWND hWnd = CreateWindowEx(WS_EX_MDICHILD,
    		pszClassName,"ChildWnd",
    		WS_CHILD|WS_VISIBLE,
    		CW_USEDEFAULT,
    		CW_USEDEFAULT,
    		CW_USEDEFAULT,
    		CW_USEDEFAULT,
    		hParent,
    		NULL,
    		g_hInst,
    		NULL);
    
    	return hWnd;
    }
    
    
    /*显示窗体*/
    void DisplayWnd(HWND hWnd)
    {
    	ShowWindow(hWnd,SW_SHOW);
    	UpdateWindow(hWnd);
    }
    
    /*消息处理*/
    void Message()
    {
    	MSG msg = {''};
    	while(GetMessage(&msg,NULL,0,0)){
    		DispatchMessage(&msg);
    	}
    }
    
    /*main*/
    int APIENTRY WinMain(HINSTANCE hInstance,
    					HINSTANCE  hPrevINstance,
    					LPSTR lpCmdLine,
    					int ShowCmd)
    {
    	/*注冊窗体*/
    	RegisterWnd("MainWnd",MainProc,COLOR_BTNFACE + 1);
    
    	RegisterWnd("ChildWnd",ChildProc,COLOR_WINDOW);
    
    	/*创建MDI主窗体*/
    	HWND hMain = createMainWnd("MainWnd");
    
    	/*创建MDICLIENT窗体*/
    	HWND hMdiClient = createMdiClient(hMain);
    	//MoveWindow(hMdiClient,0,0,500,500,TRUE);
    
    	/*创建MDI子窗体*/
    	HWND hChild =  createChildWnd(hMdiClient,"ChildWnd");
    
    	/*显示和消息处理*/
    	DisplayWnd(hMain);
    	Message();
    	return 0;
    }


  • 相关阅读:
    蠢货之对闭包表的扩展
    蠢货之TaskCompletionSource 带事件的同步调用
    SQLSERVER新建存储过程模板
    缓存更新
    写给”源码爱好者“
    区块链-一个不神秘却总能骗人的东西
    graceful-upgrades-in-go
    谁也逃不过C++
    Go的问题
    面试
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7389318.html
Copyright © 2020-2023  润新知