走进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
一个指向以零结尾的字符串的指针。或者指向曾经由RegisterClass或RegisterClassEx条用创建的原子的指针。这个原子必须是次參数的低位。高位必须是0。假设是一个字符串,它指定窗体类的名称。类名能够是用RegisterClass或RegisterClassEx注冊过的不论什么名称。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窗体有效,假设它在弹出窗体或者自窗体上被指定。则x和y參数被设置为零。
y
指定窗体的初始化垂直位置。
对于交叠式窗体或者弹出式窗体,y參数是在屏幕坐标上初始的窗体左上角的y坐标。
对于子窗体。y是和父窗体客户区左上角相关的初始子窗体左上角的y坐标。
对于listbox控件。y是和父窗体客户区左上角相关的listbox客户区初始的左上角的y坐标。
假设用WS_VISIBLE风格创建一个overlapped窗体而且x參数设置为CW_USEDEFAULT,系统忽略y參数。
nWidth
用设备单位指定窗体的宽度。对于overlapped窗体,nWidth參数既能够是在屏幕坐标上窗体的宽度。也能够是CW_USEDEFAULT.假设nWidth是CW_USEDEFAULT,系统选择一个默认的宽度和高度。这个默认的宽度从初始的x坐标到屏幕的右边缘。默认的高度从y坐标到图标区的顶端。
CW_USEDEFAULT仅对overlapped窗体可用,假设对子窗体或者弹出窗体设置了CW_USEDEFAULT,则nWidth和nHeight被设置为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 = {'\0'};
- 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 = {'\0'};
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 = {'\0'};
- 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 = {'\0'};
- 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 = {'\0'};
- 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 = {'\0'};
- 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;
- }
走进windows编程的世界-----窗体的注冊及创建的更多相关文章
- 走进windows编程的世界-----入门篇
1 Windows编程基础 1.1Win32应用程序基本类型 1) 控制台程序 不须要完好的windows窗体,能够使用DOS窗体方式显示 2) Win32窗体程序 包括窗体的程序,能够通过窗 ...
- 走进windows编程的世界-----消息处理函数(1)
Win32消息机制 过程驱动:程序是依照我们预先定义好的顺序运行.每运行一步,下一步都已经依照预定的顺序 继续运行,直至程序结束. 事件驱动:程序的运行顺序是无序的.某个时间点所运行的 ...
- 走进windows编程的世界-----画图相关
Windows画图 1 图形绘制 1.1 图形绘制的方式 获取到画图句柄-设备描写叙述表(DC),使用对应的画图的API,在设备上绘制图形. 1.2 颜色 ...
- 走进windows编程的世界-----消息处理函数(2)
一 WM_PAINT消息 1 WM_PAINT的产生 因为窗体的互相覆盖等,产生须要绘制的区域,那么会产生WM_PAINT消息. 普通情况下,不直接发送WM_PAINT消息,通过API声明须要 ...
- 走进windows编程的世界-----对话框、文本框、button
1 对话框的分类 2 对话框的基本使用方式 3 对话框资源 4 有模式对话框的使用 int DialogBox( HINSTANCE hInstance, LPCTSTR lpTemplate, ...
- 走进windows编程的世界-----windows进程
Windows进程 1 Windows进程 进程是一个容器,包括了一个应用程序实例的各种资源.Windows多任务的操作系统,因此能够同一时候运行多个进程. 2 Windows进程的 ...
- 走进windows编程的世界-----消息处理函数(3)
二 定时器消息 1 定时器消息 WM_TIMER 依照定时器设置时间段,自己主动向窗体发送一个定时器消息WM_TIMER. 优先级比較低. 定时器精度比較低,毫秒级别.消息产生时间也精度比較低 ...
- [C#] 走进异步编程的世界 - 在 GUI 中执行异步操作
走进异步编程的世界 - 在 GUI 中执行异步操作 [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5877042.html 序 这是继<开始接 ...
- 走进异步编程的世界 - 在 GUI 中执行异步操作
转载:https://www.cnblogs.com/liqingwen/p/5877042.html 走进异步编程的世界 - 在 GUI 中执行异步操作 [博主]反骨仔 [原文地址]http://w ...
随机推荐
- C#打印日志的小技巧(转)
https://www.cnblogs.com/jqg-aliang/p/5234206.html 打印日志的函数 开发中输出日志必不可少,在C#中输出多个不同类型参数的时候,需要连接符累加输出,很是 ...
- android 仿ios 对话框已封装成工具类
对话框 在android中是一种非经常见的交互提示用户的方式,可是非常多产品狗都叫我们这些做android的仿ios,搞的我们android程序猿非常苦逼,凭什么效果老是仿ios,有没有一点情怀,只是 ...
- actionbar spinner-用法实例
今天需要更改一个actionbar上的spinner的字体颜色,结果试了好长时间都没有解决,最后才发现,原来他是在代码下增加的一个textview,然后使用adapter加载的,并不是直接用frame ...
- 区分json与jsonp
JSON(JavaScript Object Notation)和JSONP(JSON with Padding)虽然只有一个字母的差别,但其实他们根本不是一回事儿,下边简单区分概括一下: JSON是 ...
- 关于JS面向对象继承问题
1.原型继承(是JS中很常用的一种继承方式) 子类children想要继承父类father中的所有的属性和方法(私有+公有),只需要让children.prototype=new father;即可. ...
- Day1:变量
一.变量用来干嘛的 用来存东西的,方便后面调用 二.如何定义变量 name = "Hiuhung Wan" 变量名 = 值,一个等号是赋值号,右边的值赋值给左边 三.变量的一些用法 ...
- 低成本开始互联网创业:探讨域名、服务器、CDN、邮箱等节流之道
互联网创业一直是个热门话题,对这个问题我也有不断的思考. 今天,探讨下如何低成本开始互联网创业. 背景 愿意冒险去创业的同志,大多是"屌丝"而非"高富帅",大多 ...
- 【2017 ACM-ICPC 亚洲区(西安赛区)网络赛 B】
[链接]h在这里写链接 [题意] 一个硬币正面朝上的概率为q/p; 抛k次,问你偶数次朝上的概率为多少. [题解] [错的次数] 0 [反思] 在这了写反思 [代码] #include <bit ...
- Android小经验
转载自:http://mp.weixin.qq.com/s?__biz=MzA4MjU5NTY0NA==&mid=404388098&idx=1&sn=8bbbba7692dc ...
- 打开utf-8文件乱码的解决方法
gvim一直用的好好的,但是今天看一网友贴出来的代码时,却发现中文显示乱码了.... 使用notepad++打开,右下角显示是utf-8 w/0 BOM. 马上放狗, 发现解决方法如下: 在_vi ...