《Windows》程序设计之对话框3

#include <Windows.h>
#include "RESOURCE.H"

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK AboutDlgProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK EllipPushWndProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
	static TCHAR szAppName[]=TEXT("About3");
	MSG msg;
	HWND hwnd;
	WNDCLASS wndclass;

	wndclass.style=CS_HREDRAW|CS_VREDRAW;
	wndclass.lpfnWndProc=WndProc;
	wndclass.cbClsExtra=0;
	wndclass.cbWndExtra=0;
	wndclass.hInstance=hInstance;
	wndclass.hIcon=LoadIcon(hInstance,szAppName);
	wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
	wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.lpszClassName=szAppName;
	wndclass.lpszMenuName=szAppName;
	if(!RegisterClass(&wndclass))
	{
		MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR);
		return 0;
	}
	wndclass.style=CS_VREDRAW|CS_HREDRAW;
	wndclass.lpfnWndProc=EllipPushWndProc;
	wndclass.cbClsExtra=0;
	wndclass.cbWndExtra=0;
	wndclass.hInstance=hInstance;
	wndclass.hIcon=NULL;
	wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
	wndclass.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);
	wndclass.lpszMenuName=NULL;
	wndclass.lpszClassName=TEXT("EllipPush");
	//在WinMain中注册了EllipPush类,并指定了回调函数为EllipPushWndProc
	RegisterClass(&wndclass);
	hwnd=CreateWindow(szAppName,TEXT("About Box Demo Program"),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 HINSTANCE hInstance;
	switch(message)
	{
	case WM_CREATE:
		hInstance=((LPCREATESTRUCT)lParam)->hInstance;
		return 0;
	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case IDM_APP_ABOUT:
			DialogBox(hInstance,TEXT("AboutBox"),hwnd,AboutDlgProc);
			return 0;
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd,message,wParam,lParam);
}

BOOL CALLBACK AboutDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
	switch(message)
	{
	case WM_INITDIALOG:
		return TRUE;
	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case IDOK:
			EndDialog(hDlg,0);
			return TRUE;
		}
		break;
	}
	return FALSE;
}

LRESULT CALLBACK EllipPushWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	TCHAR szText[40];
	HBRUSH hBrush;
	HDC hdc;
	PAINTSTRUCT ps;
	RECT rect;
	switch(message)
	{
	case WM_PAINT:
		//这边这个rect的大小只针对那个小的ok控件的
		GetClientRect(hwnd,&rect);
		//得到文本,后面用DrawText画上
		GetWindowText(hwnd,szText,sizeof(szText));
		hdc=BeginPaint(hwnd,&ps);
		//创建画笔
		hBrush=CreateSolidBrush(GetSysColor(COLOR_WINDOW));
		//选入设备描述表
		hBrush=(HBRUSH)SelectObject(hdc,hBrush);
		//设置颜色
		SetBkColor(hdc,GetSysColor(COLOR_WINDOW));
		SetTextColor(hdc,GetSysColor(COLOR_WINDOWTEXT));
		//画圆
		Ellipse(hdc,rect.left,rect.top,rect.right,rect.bottom);
		//写字
		DrawText(hdc,szText,-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
		DeleteObject(SelectObject(hdc,hBrush));
		EndPaint(hwnd,&ps);
		return 0;
		//下面这个case语句没有return 0,直接执行到下面触发SendMessage
	case WM_KEYUP:
		if(wParam!=VK_SPACE)
			break;
	case WM_LBUTTONUP:
		//向上一层窗口发消息,触发WM_COMMAND下面IDOK,最后一个参数感觉没有用到,不知道为什么要传递这个
		SendMessage(GetParent(hwnd),WM_COMMAND,GetWindowLong(hwnd,GWL_ID),(LPARAM)hwnd);
		return 0;
	}
	return DefWindowProc(hwnd,message,wParam,lParam);
}
////////////////////////////////////////////////////////////////////////
//资源中是用到了Custom Control,我写的代码,资源文件直接复制的原程序中的。
////////////////////////////////////////////////////////////////////////

中午跟老师去喝酒了,下午睡了会,晚上还普通话考试,还好,今天算是写完了。

你可能感兴趣的:(windows,command,null,callback,include,winapi)