C语言Windows程序开发—CreateWindow函数介绍【第03天】

(一)CreateWindow函数的参数介绍:

 1 HWND CreateWindow(
 2   LPCTSTR lpClassName,          //Windows窗口中预定义的控件结构体,包括:BUTTON(按钮),EDIT(文本框),LISTBOX(列表),MDICLIENT(子窗口),SCROLLBAR(滚动条),RICHEDIT(富文本),STATIC(静态控件);
 3   LPCTSTR lpWindowName,         //窗口控件中显示的内容,即Caption属性;
 4   DWORD dwStyle,                //控件样式,包括:WS_CHILD | WS_VISIBLE | WS_BORDER,还可以根据具体控件类型添加相应样式
 5   int x,                        //窗口或控件左上角(X,Y)的X坐标
 6   int y,                        //窗口或控件左上角(X,Y)的Y坐标
 7   int nWidth,                   //窗口或控件的宽度
 8   int nHeight,                  //窗口或控件的高度
 9   HWND hWndParent,              //父窗口句柄
10   HMENU hMenu,                  //菜单或者子窗口或控件的ID
11   HANDLE hInstance,             //实例
12   PVOID lpParam                 //
13 ); 

函数调用示例:

(1)创建窗口

1 /* 创建窗口 */
2 hwnd = CreateWindow (   szAppName, TEXT ("输出字符串演示"),
3                         WS_OVERLAPPEDWINDOW,
4                         CW_USEDEFAULT, CW_USEDEFAULT,
5                         CW_USEDEFAULT, CW_USEDEFAULT,
6                         NULL, NULL, hInstance, NULL ) ;

第1个参数:szAppName是字符串变量,如TEXT ("MyWindow"),表示为程序名称;

第2个参数:窗口标题名称;

第3个参数:窗口样式;

第4个参数:窗口左上角(X,Y)的X坐标,CW_USEDEFAULT表示使用缺省值;

第5个参数:窗口左上角(X,Y)的Y坐标,CW_USEDEFAULT表示使用缺省值;

第6个参数:窗口宽度,CW_USEDEFAULT表示使用缺省值;

第7个参数:窗口高度,CW_USEDEFAULT表示使用缺省值;

第8个参数:如果有父窗口,则是父窗口句柄,NULL表示没有父窗口;

第9个参数:如果有菜单,则是菜单的ID,NULL表示没有菜单;

第10个参数:执行实例代码;

第11个参数:

(2)创建控件

1 /* 创建编辑区 */
2 hwndChild[ID_EDITBOX] = CreateWindow( TEXT("edit"), NULL,
3         WS_CHILD | WS_VISIBLE | WS_BORDER |
4         ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL,
5         0, 0, 0, 0,
6         hwnd, (HMENU)ID_EDITBOX, hInst, NULL ) ;

第1个参数:创建控件所属的预定义控件结构体,TEXT ("edit")表示创建文本框,如果是TEXT("button"),则表示创建按钮;

第2个参数:控件的标题名称,在创建文本框时,该参数不为空(如TEXT(“UserName”)),则创建成功后会在文本框中显示UserName;

第3个参数:在创建控件或子窗口时,必须样式WS_CHILD | WS_VISIBLE和该控件具有的特有样式,ES_LEFT表示文本框中内容左对齐;

第4~7个参数:控件的左上角(X,Y)坐标,宽度与高度,可以在回调函数的WM_SIZE中通过MoveWindow函数进行调整;

第8个参数:父窗口句柄,表示控件文本框所在的窗口句柄;

第9个参数:控件ID,并强制转换为HMENU类型;

第10个参数:执行实例代码

第11个参数:

通过对比创建窗口或子窗口(或控件)时CreateWindow函数的参数赋值,发现:

第1个参数在创建控件时尤为重要,其作用是声明正在创建控件的预定义控件结构体;

第4~7个参数是来限定窗口或控件的尺寸;

第8个参数都表示其父窗口句柄,若是控件,则是控件所在窗口的句柄;

第10个参数都是执行实例代码,但是子窗口(或控件)的执行实例代码hInst = ((LPCREATESTRUCT) lParam) -> hInstance;

(二)CreateWindow函数实例应用

  1 /* 创建Login窗口*/
  2 #include <windows.h>
  3 #include <stdio.h>
  4
  5 #define         ID_UserName         1000
  6 #define         ID_Password         1001
  7 #define            ID_btnLogin            1002
  8
  9 /* 声明回调函数 */
 10 LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM ) ;
 11
 12 /* 声明创建窗口控件 */
 13 int CreateChildWindow ( HWND, HWND *, LPARAM ) ;
 14
 15 /* 主函数 */
 16 int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow )
 17 {
 18     static TCHAR    szAppName [] = TEXT ("Demo") ;
 19     HWND            hwnd ;
 20     MSG             msg ;
 21     WNDCLASS        wndclass ;
 22
 23     wndclass.style              = CS_HREDRAW | CS_VREDRAW ;                        //窗口样式
 24     wndclass.lpfnWndProc        = WndProc ;                                        //窗口的回调函数
 25     wndclass.hInstance          = hInstance ;                                    //窗口实例句柄
 26     wndclass.cbClsExtra         = 0 ;                                            //窗口结构体扩展:无
 27     wndclass.cbWndExtra         = 0 ;                                            //窗口实例扩展:无
 28     wndclass.hbrBackground      = ( HBRUSH ) GetStockObject ( WHITE_BRUSH ) ;   //窗口背景
 29     wndclass.hIcon              = LoadIcon ( NULL, IDI_APPLICATION ) ;            //窗口图标
 30     wndclass.hCursor            = LoadCursor ( NULL, IDC_ARROW ) ;                //窗口中的鼠标样式
 31     wndclass.lpszClassName      = szAppName ;                                    //窗口结构体名称
 32     wndclass.lpszMenuName       = NULL ;                                        //主菜单名称:无
 33
 34     /* 注册窗口结构体 */
 35     if ( !RegisterClass ( &wndclass ) )
 36     {
 37         MessageBox ( NULL, TEXT ("无法注册窗口结构体!"), TEXT ("错误"), MB_OK | MB_ICONERROR) ;
 38         return 0 ;
 39     }
 40
 41     /* 创建Login窗口 */
 42     hwnd = CreateWindow (   szAppName, TEXT ("登录"),
 43                             WS_OVERLAPPEDWINDOW,
 44                             CW_USEDEFAULT, CW_USEDEFAULT,
 45                             400, 300,
 46                             NULL, NULL, hInstance, NULL ) ;
 47
 48     /* 显示与更新窗口 */
 49     ShowWindow ( hwnd, iCmdShow ) ;
 50     UpdateWindow ( hwnd ) ;
 51
 52     /* 从消息队列中获取消息 */
 53     while ( GetMessage ( &msg, NULL, 0, 0 ) )
 54     {
 55         TranslateMessage ( &msg ) ;     //将虚拟键消息转换为字符消息
 56         DispatchMessage ( &msg ) ;      //将消息传递给回调函数处理
 57     }
 58
 59     return msg.wParam ;
 60 }
 61
 62 /* 回调函数 */
 63 LRESULT CALLBACK WndProc (HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam )
 64 {
 65     static HWND     hChild [2] ;
 66     HDC             hdc ;
 67     PAINTSTRUCT     ps ;
 68     RECT            rect ;
 69
 70     static int      cxChar, cyChar ;
 71
 72     switch ( umsg )
 73     {
 74     case WM_CREATE :            //处理窗口创建成功后发来的消息
 75         /* 创建窗口控件 */
 76         CreateChildWindow ( hwnd, hChild, lParam ) ;
 77
 78         cxChar = LOWORD (GetDialogBaseUnits ());    //获得窗口中内定字体字元宽度(低字组)
 79         cyChar = HIWORD (GetDialogBaseUnits ());    //或得窗口中内定字体字元高度(高字组)
 80         return 0 ;
 81
 82     case WM_SIZE :              //处理窗口尺寸发生改变后发来的消息
 83         GetClientRect ( hwnd, &rect ) ;
 84         MoveWindow ( hChild [ ID_UserName ], rect.left + cxChar * 12, 110, cxChar * 24,  cyChar * 5 / 4, TRUE ) ;
 85         MoveWindow ( hChild [ ID_Password ], rect.left + cxChar * 12, 160, cxChar * 24,  cyChar * 5 / 4, TRUE ) ;
 86         MoveWindow ( hChild [ ID_btnLogin ], rect.left + cxChar * 12, 210, cxChar * 12,  cyChar * 7 / 4, TRUE ) ;
 87         return 0 ;
 88
 89     case WM_PAINT :             //处理窗口产生无效区域时发来的消息
 90         GetClientRect ( hwnd, &rect ) ;
 91         hdc =  BeginPaint ( hwnd, &ps ) ;
 92         TextOut ( hdc, rect.left + cxChar * 12,  95, TEXT ("UserName:"), lstrlen ( TEXT ("UserName:") ) ) ;
 93         TextOut ( hdc, rect.left + cxChar * 12, 145, TEXT ("Password:"), lstrlen ( TEXT ("Password:") ) ) ;
 94         EndPaint ( hwnd, &ps ) ;
 95         return 0 ;
 96
 97     case WM_DESTROY :           //处理窗口关闭时发来的消息
 98         PostQuitMessage (0) ;
 99         return 0 ;
100     }
101
102     return DefWindowProc ( hwnd, umsg, wParam, lParam ) ;
103 }
104
105 /* 创建控件 */
106 int CreateChildWindow ( HWND hwnd, HWND * hChild, LPARAM lParam )
107 {
108     HINSTANCE hInst = ( ( LPCREATESTRUCT ) lParam ) -> hInstance ;
109
110     /* 创建UserName文本框 */
111     hChild [ ID_UserName ] = CreateWindow ( TEXT ("edit"), NULL,
112                             WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT,
113                             0, 0, 0 , 0,
114                             hwnd, ( HMENU ) ID_UserName, hInst, NULL ) ;
115
116     /* 创建Password文本框 */
117     hChild [ ID_Password ] = CreateWindow ( TEXT ("edit"), NULL,
118                             WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT,
119                             0, 0, 0, 0,
120                             hwnd, ( HMENU ) ID_Password, hInst, NULL ) ;
121
122     /* 创建Login按钮 */
123     hChild [ ID_btnLogin ] = CreateWindow ( TEXT ("button"), TEXT ("Login"),
124                             WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_CENTER,
125                             0, 0, 0, 0,
126                             hwnd, ( HMENU ) ID_btnLogin, hInst, NULL ) ;
127
128     return 0 ;
129 }

运行结果:

代码说明:

(1)WndProc回调函数中的消息处理

<1>WM_SIZE消息处理

1 case WM_SIZE :              //处理窗口尺寸发生改变后发来的消息
2     GetClientRect ( hwnd, &rect ) ;
3     MoveWindow ( hChild [ ID_UserName ], rect.left + cxChar * 12, 110, cxChar * 24,  cyChar * 5 / 4, TRUE ) ;
4     MoveWindow ( hChild [ ID_Password ], rect.left + cxChar * 12, 160, cxChar * 24,  cyChar * 5 / 4, TRUE ) ;
5     MoveWindow ( hChild [ ID_btnLogin ], rect.left + cxChar * 12, 210, cxChar * 12,  cyChar * 7 / 4, TRUE ) ;
6     return 0 ;

GetClientRect函数获取登录窗口的矩形区域,即登录窗口中除去标题栏的矩形区域,MoveWindow函数调整控件的尺寸(即CreateWindow函数中的第4~7个参数);

<2>WM_PAINT消息处理

1 case WM_PAINT :             //处理窗口产生无效区域时发来的消息
2     GetClientRect ( hwnd, &rect ) ;
3     hdc =  BeginPaint ( hwnd, &ps ) ;
4     TextOut ( hdc, rect.left + cxChar * 12,  95, TEXT ("UserName:"), lstrlen ( TEXT ("UserName:") ) ) ;
5     TextOut ( hdc, rect.left + cxChar * 12, 145, TEXT ("Password:"), lstrlen ( TEXT ("Password:") ) ) ;
6     EndPaint ( hwnd, &ps ) ;
7     return 0 ;

BeginPaint函数与EndPaint函数必须成对出现,BeginPaint函数表示开始绘制窗口,同时使整个显示区域变为有效,更新显示区域的内容,例如在窗口中用TextOut函数输出内容。

(2)自定义CreateChildWindow函数

 1 /* 创建控件 */
 2 int CreateChildWindow ( HWND hwnd, HWND * hChild, LPARAM lParam )
 3 {
 4     HINSTANCE hInst = ( ( LPCREATESTRUCT ) lParam ) -> hInstance ;
 5
 6     /* 创建UserName文本框 */
 7     hChild [ ID_UserName ] = CreateWindow ( TEXT ("edit"), NULL,
 8                             WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT,
 9                             0, 0, 0 , 0,
10                             hwnd, ( HMENU ) ID_UserName, hInst, NULL ) ;
11
12     /* 创建Password文本框 */
13     hChild [ ID_Password ] = CreateWindow ( TEXT ("edit"), NULL,
14                             WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT,
15                             0, 0, 0, 0,
16                             hwnd, ( HMENU ) ID_Password, hInst, NULL ) ;
17
18     /* 创建Login按钮 */
19     hChild [ ID_btnLogin ] = CreateWindow ( TEXT ("button"), TEXT ("Login"),
20                             WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_CENTER,
21                             0, 0, 0, 0,
22                             hwnd, ( HMENU ) ID_btnLogin, hInst, NULL ) ;
23
24     return 0 ;
25 }

<1>CreateChildWindow函数的参数介绍

1 int CreateChildWindow (
2     HWND        hwnd,           //父窗口句柄
3     HWND      * hChild,         //子窗口或控件句柄
4     LPARAM      lParam          //lParam参数的低字组包含显示区域宽度,高字组包含显示区域高度
5 );

<2>CreateChildWindow函数的功用

专门用于创建窗口控件,方便程序扩展,同时能够缩减回调函数的代码行数。

原文地址:https://www.cnblogs.com/petrol/p/9795401.html

时间: 2024-11-07 00:06:54

C语言Windows程序开发—CreateWindow函数介绍【第03天】的相关文章

C语言Windows程序开发—TextOut函数介绍【第02天】

(一)TextOut函数的参数介绍: 1 BOOL TextOut ( //如果函数调用成功,返回TRUE,否则,返回FALSE 2 HDC hdc, //用于显示字符串的控件ID 3 int nXStart, //字符串所在起始位置左上角(X,Y)的X坐标 4 int nYStart, //字符串所在起始位置左上角(X,Y)的Y坐标 5 LPCTSTR lpString, //显示的字符串内容 6 int cbString //字符串长度 7 ) ; 函数调用示例: 1 TextOut ( h

C语言Windows程序开发—MessageBox函数介绍【第01天】

(一)MessageBox函数的参数介绍: 1 int MessageBox ( 2 HWND hWnd, //弹出MessageBox对话框所属的窗口句柄 3 LPCTSTR lpText, //指向MessageBox对话框内容的字符串指针 4 LPCTSTR lpCaption, //指向MessageBox对话框标题的字符串指针 5 UINT uType //MessageBox对话框的风格 6 ) ; 函数调用示例: 1 MessageBox ( NULL, TEXT ("程序运行出错

MFC Windows程序开发究竟是什么?

MFC Windows程序开发究竟是什么? MFC是一个Application Framework.他是一个完整的程序模型. 什么是MFC?MFC是微软公司出品一个Application Framework.基本上,我们可以认为Application Framework就是一个完整的程序模型,具备标准软件所需的一切基本功能,比如文件存取.打印等等.从C++语言层面来看,Application Framework就是有一整套组合好的“对象”构建起来的模型.从C++语法上来说,MFC就是一套微软提供

windows API中CreateWindow()函数详解

CreateWindow函数详解 在注册完窗口类后就需要进行窗口的创建,用到的函数理所当然就是CreateWindow(), 而这个函数是基于窗口类的,所以还需要指定几个参数来制定特定的窗口.而且像一些不带边框的窗口是怎么创建的也是具有相当的技巧的,就是创建的是不带标题和边框的窗口,然后自己在客户区绘制程序的内容,能够制作个性化的应用程序. API解释 该函数创建一个重叠式窗口.弹出式窗口或子窗口.它指定窗口类,窗口标题,窗口风格,以及窗口的初始位置及大小(可选的).函数也指该窗口的父窗口或所属

Windows程序开发的背景知识---Windows消息机制

一,消息 消息(Message)指的就是Windows 操作系统发给应用程序的一个通知,它告诉应用程序某个特定的事件发生了.比如,用户单击鼠标或按键都会引发Windows 系统发送相应的消息.最终处理消息的是应用程序的窗口函数,如果程序没处理的话操作系统有默认函数将会作出处理.      从数据结构的角度来说,消息是一个结构体,它包含了消息的类型标识符以及其他的一些附加信息.系统定义的结构体MSG用于表示消息,MSG 具有如下定义形式: typedef struct MSG {      HWN

Windows程序开发必须知道的几个注册表项

1.Windows服务程序列表位置 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 2.卸载程序列表位置 32位系统 当前用户软件HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 所有用户软件HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 64位系统 当前用

windows程序开发窗口截图实现一

1.2编写窗口截图 本次选择窗口截图一共3步:鼠标按下.移动.弹起. 知识点:改变鼠标图标.截图函数封装.窗口画图 本节新学习AIP: LoadCursor SetCursor(m_hCursor); SetCapture(); CreateDC CreateCompatibleDC CreateCompatibleBitmap ClientToScreen WindowFromPoint CreateSolidBrush FrameRect -------------.. 视频观看地址: ht

【转】C语言mem.h中的函数介绍

函数名称:     memccpy函数原型:     void *memccpy(void *dest, const void *src, int c, size_t n)函数功能:     字符串拷贝,到指定长度或遇到指定字符时停止拷贝函数返回:参数说明:     src-源字符串指针,c-中止拷贝检查字符,n-长度,dest-拷贝底目的字符串指针所属文件:     string.h,mem.h #include string.h#include stdio.hint main(){    c

R语言爬虫:Rvest包函数介绍

Rvest 包中常用函数一览: 函数 作用 read_html() 读取 html 页面 html_nodes() 提取所有符合条件的节点 html_node() 返回一个变量长度相等的list,相当于对html_nodes()取[[1]]操作 html_table() 获取 table 标签中的表格,默认参数trim=T,设置header=T可以包含表头,返回数据框 html_text() 提取标签包含的文本,令参数trim=T,可以去除首尾的空格 html_attrs(nodes) 提取指定