9a 子视窗控制项--按钮类别

#include<Windows.h>
//9a 子视窗控制箱  按钮类别
struct
{
	int iStyle;
	TCHAR * szText;
}
button[]=
{
	BS_PUSHBUTTON,  TEXT ("PUSHBUTTON"),
	BS_DEFPUSHBUTTON,  TEXT ("DEFPUSHBUTTON"),
	BS_CHECKBOX,  TEXT ("CHECKBOX"), 
	BS_AUTOCHECKBOX,  TEXT ("AUTOCHECKBOX"),
	BS_RADIOBUTTON,  TEXT ("RADIOBUTTON"),
	BS_3STATE,  TEXT ("3STATE"),
	BS_AUTO3STATE,  TEXT ("AUTO3STATE"),
	BS_GROUPBOX,  TEXT ("GROUPBOX"),
	BS_AUTORADIOBUTTON,  TEXT ("AUTORADIO"),
	BS_OWNERDRAW,  TEXT ("OWNERDRAW")
};

#define NUM (sizeof button / sizeof button[0])

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
	static TCHAR szAppName[] = TEXT ("BtnLook") ;
	HWND  hwnd ;
	MSG  msg ;
	WNDCLASS  wndclass ;
	wndclass.style  = CS_HREDRAW | CS_VREDRAW ;
	wndclass.lpfnWndProc  = WndProc ;
	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 = szAppName ;
	if (!RegisterClass (&wndclass))
	{
		MessageBox ( NULL, TEXT ("This program requires Windows	NT!"),szAppName,MB_ICONERROR) ;
		return 0 ;
	}

	hwnd = CreateWindow ( szAppName, TEXT ("Button Look"),
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, CW_USEDEFAULT,
		CW_USEDEFAULT, CW_USEDEFAULT,
		NULL, NULL, hInstance, NULL) ;
	ShowWindow (hwnd, iCmdShow) ;
	UpdateWindow (hwnd) ;
	while (GetMessage (&msg, NULL, 0, 0))
	{ 
		TranslateMessage (&msg) ;
		DispatchMessage (&msg) ;
	}
	return msg.wParam ;

}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	static HWND hwndButton[NUM];
	static RECT rect;
	static TCHAR 
		szTop[] = TEXT ("message wParam lParam"),
		szUnd[] = TEXT ("_______ ______ ______"),
		szFormat[] = TEXT ("%-16s%04X-%04X %04X-%04X"),
		szBuffer[50] ;

	static int cxChar,cyChar;
	HDC hdc;
	PAINTSTRUCT ps;
	int i;

	switch(message)
	{
	case WM_CREATE:
		cxChar = LOWORD (GetDialogBaseUnits());//函数功能:该函数返回系统的对话基本单位,该基本单位为系统字体字符的平均宽度和高度。
		cyChar = HIWORD(GetDialogBaseUnits());

		for(i=0;i<NUM;i++)
			hwndButton[i]=CreateWindow(
			TEXT("button"),
			button[i].szText,
			WS_CHILD | WS_VISIBLE | button[i].iStyle,
			cxChar, cyChar * (1 + 2 * i),
			20 * cxChar, 7 * cyChar / 4,
			hwnd, 
			(HMENU) i,
			((LPCREATESTRUCT) lParam)->hInstance,//
			NULL);
		/*在处理 WM_CREATE 讯息的过程中, lParam 实际上是指向 CREATESTRUCT
		(「建立结构」 ) 结构的指标, 该结构有一个 hInstance 成员。 所以将 lParam
		转换成指向 CREATESTRUCT 结构的一个指标, 并取出 hInstance。*/
		return 0 ;
		/*
		HWND CreateWindow(
		LPCTSTR lpClassName,
		LPCTSTR lpWindowName,
		DWORD dwStyle,
		int x,
		int y,
		int nWidth,
		int nHeight,
		HWND hWndParent,
		HMENU hMenu,
		HANDLE hlnstance,
		LPVOID lpParam);
		*/
	case WM_SIZE:
		rect.left=24*cxChar;
		rect.top=2*cyChar;
		rect.right=LOWORD(lParam);
		rect.bottom=HIWORD(lParam);
		return 0;


	case WM_PAINT:
		InvalidateRect(hwnd,&rect,TRUE);

		hdc = BeginPaint (hwnd, &ps) ;
		SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;//SYSTEM_FIXED_FONT:固定间距(等宽)系统字体,该对象仅提供给兼容16位Windows版本;
		SetBkMode (hdc, TRANSPARENT) ;

		TextOut (hdc, 24 * cxChar, cyChar, szTop, lstrlen (szTop)) ;
		TextOut (hdc, 24 * cxChar, cyChar, szUnd, lstrlen (szUnd)) ;
		EndPaint (hwnd, &ps) ;
		return 0 ;
	case WM_DRAWITEM :
	case WM_COMMAND :
		ScrollWindow (hwnd, 0, -cyChar, &rect, &rect) ;
		//ScrollWindow 该函数滚动所指定的窗口客户区域内容。该函数存在向后兼容性,新的应用程序应使用ScrollWindowEX。

		hdc = GetDC (hwnd) ;
		SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
		TextOut( hdc, 24 * cxChar, cyChar * (rect.bottom / cyChar- 1),
			szBuffer,
			wsprintf (szBuffer, szFormat,
			message == WM_DRAWITEM ?
			TEXT ("WM_DRAWITEM") : TEXT ("WM_COMMAND"),
			HIWORD (wParam), LOWORD (wParam) ,//
			HIWORD (lParam), LOWORD	(lParam))) ;//
		/*
		LOWORD (wParam) 子视窗 ID
		HIWORD (wParam) 通知码
		lParam 子视窗代号
		*/
		ReleaseDC (hwnd, hdc) ;//
		ValidateRect (hwnd, &rect) ;
		break ;
	case WM_DESTROY :
		PostQuitMessage (0) ;
		return 0 ;
	}
	return DefWindowProc (hwnd, message, wParam, lParam) ;


}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值