您的位置:首页 > 其它

win32创建控件和提示文本

2013-04-15 10:22 302 查看
基于SDK的win32程序框架一般总是由两个基本函数组成:一个是入口函数WinMain,它包含了整个框架的运行代码;另一个是用户定义的窗口过程函数SDKWndProc(名称可以在程序中自动定义),用来接收 和处理各种不同的消息。

#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK SDKWndProc (HWND, UINT, WPARAM, LPARAM);		// 窗口过程

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
HWND       	hwnd ;			// 窗口句柄
MSG        	msg ;			// 消息
WNDCLASS		wndclass ;		// 窗口类
wndclass.style  			= CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc   	= SDKWndProc ;
wndclass.cbClsExtra    	= 0 ;
wndclass.cbWndExtra    	= 0 ;
wndclass.hInstance     	= hInstance ;
wndclass.hIcon         	= LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor       	= LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground 	= (HBRUSH) GetStockObject ( WHITE_BRUSH ) ;
wndclass.lpszMenuName  	= NULL ;
wndclass.lpszClassName 	= "SDKWin";			// 窗口类名
if (!RegisterClass (&wndclass))				// 注册窗口
{
MessageBox (NULL, "窗口注册失败!", "HelloWin", 0) ;
return 0 ;
}

// 创建窗口
hwnd = CreateWindow ("SDKWin",                 	// 窗口类名
"实验2 Windows编程基础",		// 窗口标题
WS_OVERLAPPEDWINDOW,			// 窗口样式
CW_USEDEFAULT,            	// 窗口最初的 x 位置
CW_USEDEFAULT,             	// 窗口最初的 y 位置
400,             	// 窗口最初的 x 大小
320,             	// 窗口最初的 y 大小
NULL,                       	// 父窗口句柄
NULL,                       	// 窗口菜单句柄
hInstance,                  	// 应用程序实例句柄
NULL) ;                     	// 创建窗口的参数
ShowWindow (hwnd, nCmdShow) ;			// 显示窗口
UpdateWindow (hwnd) ;					// 更新窗口,包括窗口的客户区
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;		// 转换某些键盘消息
DispatchMessage (&msg) ;		// 将消息发送给窗口过程,这里是WndProc
}
return msg.wParam ;
}

LRESULT CALLBACK SDKWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static	HWND	hwndHint, hwndRes, hwndEdit, hwndBtn;
HFONT			hFont;
switch (message)
{
case WM_CREATE:		hFont		= (HFONT)GetStockObject ( DEFAULT_GUI_FONT );
hwndHint	= CreateWindow("STATIC", "输入半径: ",
WS_CHILD | WS_VISIBLE | SS_SIMPLE,
20, 20, 100, 20, hwnd, NULL, NULL, NULL );
hwndEdit	= CreateWindow("EDIT", NULL,
WS_CHILD | WS_VISIBLE | WS_BORDER,
20, 40, 100, 20, hwnd, NULL, NULL, NULL );
hwndBtn		= CreateWindow("BUTTON", "圆面积",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
140, 40, 80, 20, hwnd, NULL, NULL, NULL );
hwndRes	= CreateWindow("STATIC", NULL,
WS_CHILD | WS_VISIBLE | SS_SIMPLE,
20, 70, 180, 20, hwnd, NULL, NULL, NULL );

SendMessage(hwndHint,	WM_SETFONT, (WPARAM)hFont,  (LPARAM)TRUE);
SendMessage(hwndEdit,	WM_SETFONT, (WPARAM)hFont,  (LPARAM)TRUE);
SendMessage(hwndBtn,	WM_SETFONT, (WPARAM)hFont,  (LPARAM)TRUE);
SendMessage(hwndRes,	WM_SETFONT, (WPARAM)hFont,  (LPARAM)TRUE);
break;
case WM_COMMAND:	// 命令消息,控件产生的通知代码在wParam的高字中
if (((HWND)lParam == hwndBtn )&&( HIWORD(wParam) == BN_CLICKED ))
{
char	strEdit[80];
// 获取编辑框控件的内容,并将其转换成float数值
if ( GetWindowText( hwndEdit, strEdit, 80) > 0 ) 	// 获取编辑框内容
{
float fRes = (float)atof( strEdit );
if ( fRes > 0.0f )
{
sprintf( strEdit, "圆面积为: %f", 3.14 * fRes * fRes );
SetWindowText( hwndRes, strEdit );
} else
MessageBox( hwnd, "圆半径输入无效!", "注意", 0 );
} else
MessageBox( hwnd, "请输入圆的半径!", "注意", 0 );
}
break;

case WM_DESTROY:	// 当窗口关闭时产生的消息
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ; // 执行默认的消息处理
}


在CALLBACK SDKWndProc 中,这样就创建了两个静态控件、一个编辑框和一个按钮。需要说明的是:

将hwndHint\hwndRes\hwndEdit和hwndButton窗口句柄定义成static的目的是使其成为全局变量,当SDKWndPro第一次调用创建后,就会一直有效。用CreateWindow函数创建窗口时,若指定的是预定义的窗口名BUTTON、COMBOBOX、EDIT、LISTBOX、SCROLLBAR和STATIC,则创建的是按钮、组合框、编辑框、列表框、滚动条和讲台空间等窗口。由于这些空间窗口必须是主窗口的子窗口,所以为其指定的风格中一定要有WS_CHILD和WS_VISIBLE,同时指定父窗口句柄为主窗口句柄hwnd。

各空间的字体可通过SendMessage函数并指定WM_SETFONT消息来更改。DEFAULT_GUI_FONT是获取系统消息对话框和菜单中的默认字体。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐