API函数CreateWindow()
大家平时用MFC来建立一个程序的窗口时,只要跟这向导一步步的进行,就可以的到一个比较完美的程序窗口。而API是MFC的核心,大家有没有想过API是怎么来建立窗口的呢?下面我
们来看看API创建窗口函数CreateWindow()。
函数原型: HWNDCreateWindow(lpszClassName,lpszWindowName,dwStyle,x,y,nWidth,nHeight,hwndParent,hmenu,hinst,lpvParam)
参数说明: lpszClassName 他是一个指向一个NULL结束的字符串,或者是一个整数原子。如果该参数是一个原 子,则它必须是由以前调用GlobalAddAtom函数(一个原子函数)所创
建的一个全局原子。该原子是一个小于0XC000的16位值,它必须位于lpszClassName的低位字中,其高位字必须为0。也可以指定lpszClassName为一个字符串,那么他就是指定窗口类
的名字。这个类名可以是用RegisterClass函数注册的任何字名,或者是任何预定义的控制类名字。 LpszWindowName 指向一个以NULL结束的字符串,该串指定此窗口的名字。
DwStyle 指定所创建窗口的式样。该参数可以是下面窗口式样和控制式样的组合。 式样 解释 WS_BORDER 创建一个细线边框的窗口 WS_CAPTION 创建一个有标题栏的窗口(包括
WS_BORDER式样 WS_CHILD 创建一个子窗口。此式样不能与WS_POPUP样式一起使用。 WS_CHILDWINDOW 与WS_CHILD式样相同 WS_CLIPHILDREN 当在父窗口中画图时,绕开子窗口占有的
区域。创建窗口时使用此式样。 WS_CLIPSIBLINGS 裁剪相互关联的子窗口,即当一个特殊子窗口接收到一条WM_PAINT消息时,WS_CLIPSIBLINGS式样,且子窗口有覆盖现象,那么当在
某个子窗口的客户区域内画图时,有可能在相邻窗口的客户区域内也画进了内容,此式样仅适合于具有WS_CHILD式样的窗口。 WS_DISABLED 创建一个开始时被禁止的窗口。此窗口不
能从用户那里接收输入。 WS_DLGFRAME 创建一个带有某种式样的边框的窗口,该式样一般情况下与对话框一起使用。具有这种式样的窗口不能有一个标题栏。 WS_GROUP 指定一组控
制中的第一个控制,用户在这组控制中,通过使用方向键可从一个控制移动到下一个控制。所有在第一个控制之后的用WS_GROUP式样定义的控制属于同一组。具有WS_GROUP式样的下一
个控制组,并且开始下一个控制组。 WS_HSCROLL 创建一个具有水平滚动条的窗口 WS_MAXIMIZE 创建一个初始时被最大化的窗口 WS_MAXIMIZEBOX 创建一个带有Maximize按钮的窗口
WS_MINIMIZE 创建一个初始时被最小化的窗口 WS_MINIMIZEBOX 创建一个带有Minimize按钮的窗口 WS_OVERLAPPED 创建一个重叠式窗口。一个重叠式窗口带有一个标题栏和一个边框
。 WS_OVERLAPPEDWINDOW 创建一个 WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU,WS_THICKFRAME,WS_WS_MINIMIZEBOX和WS_MAXIMIZEBOX式样的重叠式窗口。 WS_POPUP 创建一个弹出式窗
口。该式样不能与WS_CHILD式样一起使用。 WS_POPUPWINDOW 创建一个具有WS_BORDER,WS_POPUP和WS_SYSMENU式样的弹出式窗口。为了使system菜单可见,必须将WS_CAPTION和
WS_POPUPWINDOW式样组合使用。 WS_SYSMENU 创建一个在其标题栏中有system菜单框的窗口。还必须指定WS_CAPTION式样。 WS_TABSTOP 指定一个控制,当用户按TAB键时,该控制能
接收键盘焦点。按TAB键可将键盘焦点移到下一个具有WS_TABSTOP式样的控制中。 WS_THICKFRAME 创建一个带一个宽边框的窗口。该边框可用于改变窗口的大小。 WS_VISIBLE 创建一
个初始时可见的窗口。 WS_VSCROLL 创建一个具有垂直滚动条的窗口。 X 指定窗口的初始水平位置,对于一个重叠式或弹出式窗口,X参数为窗口左上角初始的X坐标,在屏幕坐标系
中,对于一个子窗口,X是窗口左上角的X坐标,相对于其他父窗口的客户区域的左上角。如果这个参数设置为CW_USEDEFAULT,则Windows为该窗口的左上角选择缺省的位置,并忽略Y参
数。CW_USEDEFAULT只对重叠式窗口有效;如果它被指定给一弹出式窗口或一个子窗口,则X和Y参数均设置为0。 Y 指定窗口的初始垂直位置。对于一个重叠式弹出式窗口,Y参数为窗
口左上角初始的Y坐标,在屏幕坐标系中。对于一个子窗口,Y是相对于其父窗口的客户区域的左上角的窗口左上角的初始Y坐标。对于一个列表框,Y是列表框的客户区域的左上角的初
始Y坐标,相对于其父窗口的客户区域的左上角。 NWidth 指定窗口的宽度,以设备单位计。 NHeight 指定窗口的高度,以设备单位计。 HwndParent 标识被创建窗口的父窗口或拥有
者窗口。 Hmenu 标识一个菜单,或指定一个子窗口标识符,这取决于窗口的式样。 Hinst 标识与此窗口相关联的模块的实例。 Lpvparam 指向一个传递给该窗口的值,这个传递是通
过WM_CREATE消息的lParam参数引用的CREATESTRUCT数据结构完成的。
例子如下: #define MAX_LOADSTRING 100
// Global Variables: HINSTANCE hInst;
// current instance TCHAR szTitle[MAX_LOADSTRING];
// The title bar text TCHAR szWindowClass[MAX_LOADSTRING];
// The title bar text
// Foward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// TODO: Place code here.
MSG msg;
HACCEL hAccelTable;
// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_KI, szWindowClass, MAX_LOADSTRING)
; MyRegisterClass(hInstance);
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_KI);
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
// // FUNCTION: MyRegisterClass()
// // PURPOSE: Registers the window class.
// // COMMENTS:
// // This function and its usage is only necessary if you want this code
// to be compatible with Win32 systems prior to the 'RegisterClassEx'
// function that was added to Windows 95. It is important to call this function
// so that the application will get 'well formed' small icons associated
// with it.
// ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_KI);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCSTR)IDC_KI;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
return RegisterClassEx(&wcex);
}
// // FUNCTION: InitInstance(HANDLE, int)
// // PURPOSE: Saves instance handle and creates main windo
w // // COMMENTS:
// // In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance;
// Store instance handle in our global variable
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if
(!hWnd)
{ return FALSE; }
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE; }
// // FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
// // PURPOSE: Processes messages for the main window.
// // WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
// //
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{ int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
switch (message)
{ case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId) {
case IDM_ABOUT: DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
RECT rt;
GetClientRect(hWnd, &rt);
DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER); EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}
中国海量技术资料网站超级搜索
本站声明
- 如果您发现链接错误,请通知我们,不胜感激。
- 如果您认为本站文章侵犯您的版权,请通知我们,我们将立即删除。
- 本站提供的文章收集连接于其他网站,版权归作者所有。
- 本站的文章仅供学习和研究之用,严禁用于商业用途。
最新统计
- 文章中心总数:51611篇
- 今日更新文章:0篇
- 本周更新文章:0篇
- 备用更新文章:10篇

