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编程的世界-----窗体的注冊及创建的更多相关文章

  1. 走进windows编程的世界-----入门篇

    1   Windows编程基础 1.1Win32应用程序基本类型 1)  控制台程序 不须要完好的windows窗体,能够使用DOS窗体方式显示 2)  Win32窗体程序 包括窗体的程序,能够通过窗 ...

  2. 走进windows编程的世界-----消息处理函数(1)

    Win32消息机制     过程驱动:程序是依照我们预先定义好的顺序运行.每运行一步,下一步都已经依照预定的顺序 继续运行,直至程序结束.     事件驱动:程序的运行顺序是无序的.某个时间点所运行的 ...

  3. 走进windows编程的世界-----画图相关

    Windows画图 1 图形绘制      1.1 图形绘制的方式      获取到画图句柄-设备描写叙述表(DC),使用对应的画图的API,在设备上绘制图形.          1.2 颜色     ...

  4. 走进windows编程的世界-----消息处理函数(2)

    一 WM_PAINT消息 1 WM_PAINT的产生   因为窗体的互相覆盖等,产生须要绘制的区域,那么会产生WM_PAINT消息.   普通情况下,不直接发送WM_PAINT消息,通过API声明须要 ...

  5. 走进windows编程的世界-----对话框、文本框、button

    1 对话框的分类  2 对话框的基本使用方式  3 对话框资源  4 有模式对话框的使用 int DialogBox( HINSTANCE hInstance, LPCTSTR lpTemplate, ...

  6. 走进windows编程的世界-----windows进程

    Windows进程  1 Windows进程    进程是一个容器,包括了一个应用程序实例的各种资源.Windows多任务的操作系统,因此能够同一时候运行多个进程.      2 Windows进程的 ...

  7. 走进windows编程的世界-----消息处理函数(3)

    二 定时器消息 1 定时器消息 WM_TIMER   依照定时器设置时间段,自己主动向窗体发送一个定时器消息WM_TIMER. 优先级比較低.   定时器精度比較低,毫秒级别.消息产生时间也精度比較低 ...

  8. [C#] 走进异步编程的世界 - 在 GUI 中执行异步操作

    走进异步编程的世界 - 在 GUI 中执行异步操作 [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5877042.html 序 这是继<开始接 ...

  9. 走进异步编程的世界 - 在 GUI 中执行异步操作

    转载:https://www.cnblogs.com/liqingwen/p/5877042.html 走进异步编程的世界 - 在 GUI 中执行异步操作 [博主]反骨仔 [原文地址]http://w ...

随机推荐

  1. 桌面版chrome调试APP的webview的步骤:

    1. 在chrome地址栏输入:chrome://inspect/ 2.手机插入电脑USB口,打开开发者选项,OK,可以了. 友情链接:http://www.cnblogs.com/slmk/p/75 ...

  2. 洛谷——P1540 机器翻译

    https://www.luogu.org/problem/show?pid=1540#sub 题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 题目描述 这个翻译软件的 ...

  3. Flume Sinks官网剖析(博主推荐)

    不多说,直接上干货! Flume Sources官网剖析(博主推荐) Flume Channels官网剖析(博主推荐) Flume Channel Selectors官网剖析(博主推荐) 一切来源于f ...

  4. JS搜索菜单实现

    1 <!--菜单搜索功能--> 2 <!--先写静态页面--> 3 <!DOCTYPE html> 4 <html> 5 <head> 6 ...

  5. Android 迭代器 Iteraor迭代器以及foreach的使用

    Iterator是一个迭代器接口,专门用来迭代各种Collection集合,包括Set集合和List集合. Java要求各种集合都提供一个iteratot()方法,该方法返回一个Iterator用于遍 ...

  6. HTTP网络协议(四)

    确保Web安全的HTTPS HTTP存在三个比较明显的缺点: 通信使用明文(不加密),内容可能会被窃听. 不验证通信方的身份,因此有可能遭遇伪装. 无法证明报文的完整性,所以可能已遭篡改.  尽管HT ...

  7. Altium Designer中的粉红色网格和绿色框框

  8. POJ 3468 A Simple Problem with Integers 线段树区间修改

    http://poj.org/problem?id=3468 题目大意: 给你N个数还有Q组操作(1 ≤ N,Q ≤ 100000) 操作分为两种,Q A B 表示输出[A,B]的和   C A B ...

  9. [React Intl] Use Webpack to Conditionally Include an Intl Polyfill for Older Browsers

    Some browsers, such as Safari < 10 & IE < 11, do not support the JavaScript Internationali ...

  10. UVA 11280 - Flying to Fredericton SPFA变形

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&c ...