第四篇--窗体风格
WS_BORDER //创建一个具有细线边框的窗口。 WS_CAPTION //创建一个标题栏(包括WS_BORDER样式)的窗口。 WS_CHILD //创建一个子窗口。具有此样式的窗口不能有菜单栏。此样式不能与WS_POPUP样式一起使用。 WS_CHILDWINDOW //与WS_CHILD样式相同。 WS_CLIPCHILDREN //排除在父窗口内进行绘图时子窗口占用的区域。创建父窗口时使用此样式。 WS_CLIPSIBLINGS //剪辑儿童窗户相对于彼此; //也就是说,当特定子窗口收到WM_PAINT消息时,WS_CLIPSIBLINGS样式会将所有其他重叠子窗口剪切出要更新的子窗口区域。如果未指定WS_CLIPSIBLINGS并且子窗口重叠,则在子窗口的客户区内绘制时,可///以在邻近子窗口的客户区中绘制。 WS_DISABLED //创建一个初始禁用的窗口。禁用的窗口无法从用户接收输入。要在创建窗口后更改此选项,请使用EnableWindow。 WS_DLGFRAME //创建一个具有通常与对话框一起使用的样式边框的窗口。具有此样式的窗口不能有标题栏。 WS_GROUP //指定一组控件的第一个控件。该组由此第一个控件和之后定义的所有控件组成,直到使用WS_GROUP样式的下一个控件。每个组中的第一个控件通常具有WS_TABSTOP样式,以便用户可以从组移动到组。用户随///后可以使用方向键将键盘焦点从组中的一个控件更改为组中的下一个控件。 //您可以打开和关闭此样式更改对话框导航。要在创建窗口后更改此样式,请使用SetWindowLong。 WS_HSCROLL //创建一个具有水平滚动条的窗口。 WS_ICONIC //创建一个最初被最小化的窗口。与WS_MINIMIZE样式相同。 WS_MAXIMIZE //创建最初最大化的窗口。 WS_MAXIMIZEBOX //创建一个具有最大化按钮的窗口。无法与WS_EX_CONTEXTHELP样式组合。还必须指定WS_SYSMENU样式。 WS_MINIMIZE //创建一个最初被最小化的窗口。与WS_ICONIC样式相同。 WS_MINIMIZEBOX //创建一个具有最小化按钮的窗口。无法与WS_EX_CONTEXTHELP样式组合。还必须指定WS_SYSMENU样式。 WS_OVERLAPPED //创建重叠的窗口。重叠的窗口具有标题栏和边框。与WS_TILED样式相同。 WS_OVERLAPPEDWINDOW //使用WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU,WS_THICKFRAME,WS_MINIMIZEBOX和WS_MAXIMIZEBOX样式创建重叠的窗口。与WS_TILEDWINDOW样式相同。 WS_POPUP //创建一个弹出窗口。此样式不能与WS_CHILD样式一起使用。 WS_POPUPWINDOW //创建一个包含WS_BORDER,WS_POPUP和WS_SYSMENU样式的弹出窗口。必须组合WS_CAPTION和WS_POPUPWINDOW样式才能使窗口菜单可见。 WS_SIZEBOX //创建一个具有大小边框的窗口。与WS_THICKFRAME风格相同。 WS_SYSMENU //在其标题栏上创建一个窗口菜单。还必须指定WS_CAPTION样式。 //没试出来!! WS_TABSTOP //指定当用户按TAB键时可以接收键盘焦点的控件。按Tab键将键盘焦点更改为具有WS_TABSTOP样式的下一个控件。 //您可以打开和关闭此样式更改对话框导航。要在创建窗口后更改此样式,请使用SetWindowLong。 WS_THICKFRAME //创建一个具有大小边框的窗口。与WS_SIZEBOX样式相同。 WS_TILED //创建重叠的窗口。重叠的窗口具有标题栏和边框。与WS_OVERLAPPED样式相同。 WS_TILEDWINDOW //使用WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU,WS_THICKFRAME,WS_MINIMIZEBOX和WS_MAXIMIZEBOX样式创建重叠的窗口。与WS_OVERLAPPEDWINDOW样式相同。 WS_VISIBLE //创建一个最初可见的窗口。 //可以使用ShowWindow或SetWindowPos打开和关闭此样式。
风格 | 说明 |
ES_AUTOHSCROLL | 当输入文字超出横向显示范围时自动滚动(一般必选)。 |
ES_AUTOVSCROLL | 当输入文字超出纵向显示范围时自动滚动。 |
ES_CENTER | 文本居中对齐。 |
ES_LEFT | 文本左对齐(默认) |
ES_RIGHT | 文本右对齐。 |
ES_MULTILINE | 是否允许多行输入。 |
ES_PASSWORD | 是否为密码输入框,如果指明该风格则输入的文字显示为“***”。 |
ES_READONLY | 是否为只读。禁止用户输入或修改编辑控件中的文本。 |
ES_UPPERCASE | 显示大写字符。 |
ES_LOWERCASE | 显示小写字符 |
ES_LOWERCASE | 将用户输入到编辑控件的字符全部转换为小写。 |
ES_UPPERCASE | 将用户输入到编辑控件的字符全部转换为大写。 |
ES_MULTILINE |
指明了一个多行编辑控件(缺省的是单行的)。 1) 如果指定了ES_AUTOVSCROLL风格,编辑控件将显示尽可能多的文本,并且当用户按下ENTER键时会自动地垂直滚动文本。 2) 如果没有指定ES_AUTOVSCROLL风格,则编辑控件将显示尽可能多的行,如果在按下ENTER键却没有更多的行要显示的话,就发出蜂鸣声。 3) 如果指定了ES_AUTOHSCROLL风格,当光标到达控件的右边时,多行编辑控件会自动地水平滚动文本。如果要开始一个新行,用户必须按下ENTER键。 4) 如果没有指定ES_AUTOHSCROLL风格,控件会在有必要时自动将单词折合到下一行的开始。如果按下ENTER键,则另起一行。折回单词的位置是由窗口的大小决定的。如果窗口的大小发生改变,折回单词的位置也会反生改变,将会重新显示文本。 |
example1:创建带边框静态文本文件
text = CreateWindow(TEXT("static"), TEXT("Please enter HoodLock change times you heard"), WS_CHILD /*子窗口*/ | WS_VISIBLE /*创建时显示*/ | WS_BORDER /*带边框*/ | SS_LEFT /*水平居左*/, 20, 10, 600, 430, hwnd, NULL, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL );
example2:创建按钮类型
static HWND hwndButton; //按钮句柄 hwndButton = CreateWindow(L"BUTTON", L"1", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 650, 20, 85, 30, hwnd, NULL, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
example3:创建编辑窗口
edit = CreateWindow( TEXT("edit"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL, 0, 0, 0, 0, hwnd, NULL, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL ) ;
example4:扩展窗口的创建
HWND lhWnd = CreateWindowEx(NULL, L"button", L"222", WS_CHILD | WS_VISIBLE, 0, 0, 100, 20, hwnd, NULL, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
//创建凹陷文本框控件 text = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("static"), TEXT("111"), WS_CHILD /*子窗口*/ | WS_VISIBLE /*创建时显示*/ | WS_BORDER /*带边框*/ | SS_LEFT /*水平居左*/, 20, 20, 490, 300, hwnd, NULL, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL );
类 | 实际含义 |
BUTTON |
一个小的矩形子窗口,该子窗口代表一个按钮,用户能通过鼠标单击来打开或关闭它。按钮控件可单独使用或成组使用,也可贴上文字标签,也可不包含文本。当用户用鼠标单击此按钮时,按钮控件常常要改变它的显示外观。 |
COMBOBOX |
规定一个控件,该控件由类似与一个编辑控件和一个列表框的选择区域组成。列表框可一直显示,或由用户单击紧挨选择域的下拉图标来显示或隐藏。用户能否编辑选择域中的内容取决于组合框的方式。如果列表框是可见的,则键入到选择框中的内容将使列表框中与输入字符匹配的第1条列表框项变成高亮显示。相反,在列表框中选择一个项后,将在选择域中显示这个选择项。 |
EDIT |
规定一个矩形子窗口。用户能在这个窗口通过键盘输入文字。用户选择控件后,输入焦点将赋给此控件,这可通过在此控件上按下鼠标键或用Tab键将输入该焦点移到此控件上来实现。当控件显示一个闪烁的插入字符时,用户就能输入文字。鼠标能用于移动光标和选择要替换的字符或者在插字符处定位光标。Backspace键能用来删除字符。编辑控件使用变宽字并显示ANSI字符,编译运行用以前Windows版本的应用程序,将显示不等宽字体的文字。应用程序还可发送WM_SETFONT消息给编辑控制,以便改变缺省字体。编辑控件把制表符按需要扩展成多个空格字符,以把光标移到下一个制表定位处。Tab的停止位置假定在第8个字符位置上。 |
LISTBOX |
指定一个字符串表。应用程序在任何需要显示一个名字列表的时候(例如:用户查看和选择文件名)该控件将被使用。用户可通过鼠标单击选中一个串,此串被高亮显示,并且发送一个通知信息给父窗口。在列表框控件中,可使用垂直或水平的屏幕滚动条,以便在控件窗口中滚动超出列表框范围的列表项。列表框可根据需要自动地隐藏或显示屏幕滚动条。 |
MDICLIENT |
指定一个MDI用户窗口。用户窗口接收控制MDI应用程序子窗口的消息。推荐方式为WS_CLIPCHIILDREN和WS_CHILD。应用程序可以使用WS_HSCROLL和WS_VSCROLL方式来创建一个允许用户滚动MDI子窗口的MDI用户窗。 |
RichEdit |
指定一个RichEdit1.0控件,此控件可以查看和编辑文本,并且具有字符和段落功能。此控件还能够接纳COM对象。 指定一个RichEdit2.0控件 |
SCROLLBAR |
指定一个滚动条矩形,此矩形两头有方向箭头,中间有翻阅块。每当用户在滚动条控件上按键时,滚动条就发送一个通知消息给它的父窗口。如果必要的话,父窗口负责修改翻阅块。滚动条控制与普通窗口中使用滚动条具有相同的外观并使用相同的函数。但与一般滚动条不同,滚动条控件能够定位在窗口中的任何位置上,并在任何需要为一个窗口提供滚动条输入时使用。 |
STATIC |
指定“一个简单的正文域、框,或者可贴上标签的矩形、框,或分开其他控制的矩形”。静态空间无输入,也不提供输入。 |
② lpWindowName:指向一个以NULL为终止符的字符串,该字符串代表该窗口的名字。
③ dwStyle:指定所创建的窗口样式。它可以是下表中给出的任何方式的组合。
④ X:指定窗口初始的X位置。对于重叠式窗口或者弹出式窗口,X参数为窗口左上角初始的x坐标(在屏幕坐标系中)。
如果这个值是CW_USEDEFAULT,Windows为窗口左上角选择缺省的位置。对于一个子窗口,X是窗口在其父窗口的用户区域中
⑤ Y:指定
要写一个窗体,首先要初始化窗体
InitWindowsApp
bool InitWindowsApp(HINSTANCE stanceHandle, int show) { WNDCLASS wc; //窗体类结构体 wc.style = CS_HREDRAW | CS_VREDRAW; //窗体风格 wc.lpfnWndProc = WndProc; //窗体处理函数 wc.cbClsExtra = 0; //窗体类是否由扩展 wc.cbWndExtra = 0; //窗体实例是否由扩展 wc.hInstance = stanceHandle; //窗体句柄 wc.hIcon = LoadIcon(0, IDI_APPLICATION); //窗体图标 wc.hCursor = LoadCursor(NULL, IDC_ARROW); //窗体鼠标样式 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //窗体背景颜色 wc.lpszMenuName = NULL; //窗体菜单 wc.lpszClassName = L"BaseWndClass"; //窗体类名 if (!RegisterClass(&wc)) { MessageBox(0, L"注册失败", 0, 0); return false; } //创建窗体 HMainwnd = CreateWindow(L"BaseWndClass", //窗体类名 L"MyFrom", //窗体标题名 WS_OVERLAPPEDWINDOW, //窗体风格 CW_USEDEFAULT, CW_USEDEFAULT, //窗体坐标 780, //窗体宽 500, //窗体高 NULL, //窗体的父窗体 NULL, //窗体的子菜单 stanceHandle, //窗体句柄 NULL); // 如果函数成功,返回值为新窗口的句柄:如果函数失败,返回值为NULL //去标题栏 SetWindowLong(HMainwnd, GWL_STYLE, GetWindowLong(HMainwnd, GWL_STYLE) & ~WS_CAPTION); if (HMainwnd == 0)//判断创建窗体是否成功 { MessageBox(0, L"创建窗体失败", 0, 0); return false; } ShowWindow(HMainwnd, SW_SHOW); //显示窗体 ShowWindow(HButton, SW_SHOW); //显示窗体 UpdateWindow(HMainwnd); //绘制窗体; UpdateWindow(HButton); //绘制窗体; return true; }
然后要编写窗口过程
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HINSTANCE hInstance; //窗口实例 static HWND hwndButton; //按钮句柄 static HWND text; //文本框 switch (message) { case WM_CREATE: //创建按钮 { hInstance = ((LPCREATESTRUCT)lParam)->hInstance; //按钮1 hwndButton = CreateWindow(L"BUTTON", L"1", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 10, 10, 100, 40, hwnd, NULL, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL); //创建文本框控件 text = CreateWindow(TEXT("static"), TEXT("HelloWorld"), WS_CHILD /*子窗口*/ | WS_VISIBLE /*创建时显示*/ | WS_BORDER /*带边框*/ | SS_LEFT /*水平居左*/, 200, 10, 100, 100, hwnd, NULL, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL ); return 0; } case WM_COMMAND: //响应按钮消息 if ((HWND)lParam == hwndButton) { result(); } DestroyWindow(hwnd); return 0; case WM_CLOSE: //关闭 DestroyWindow(hwnd); return 0; case WM_DESTROY: //退出程序 PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); }
最后写一个循环接收消息函数
int run() { MSG msg = { 0 }; //消息结构 BOOL bRet = 1; //获取消息 while ((bRet = GetMessage(&msg, 0, 0, 0)) != 0)//消息循环 { if (bRet == -1)//判断消息是否接收失败 { MessageBox(0, L"接受消息失败", 0, 0); break; } else { TranslateMessage(&msg); //转换消息为字符消息 DispatchMessage(&msg); //发送消息给窗口 } } return (int)msg.wParam; }
如果要调用程序的窗体的话,只需要在要调用的地方使用以下语句
if (!InitWindowsApp(hInstance, nShowCmd)) { cout << "初始化失败" << endl; } run(); //初始化成功后循环接收消息
vc++ win32项目添加文本编辑框、静态文本、按钮、Richedit等控件
有用。