一个简单的win32程序

 要实现窗口居中显示并不难,只要在窗体创建的时候我们设置窗口的位置就可以了.在这里我们主要用到3个API函数,分别是:GetSysMetrics,GetWindowRect,SetWindowPos.
我们用GetSysMetrics来获的屏幕的宽度和高度,然后用GetWindowRect来获取窗口的坐标.通过运算后计算出居中窗口的位置,最后用SetWindowPos来设置窗体的位置.整个过程就是如此,而这些部步骤我们都要在窗口创建之前设置好,所以我们要把这些实现方法写进WM_CREATE消息中.
现在让我们看一下,以上3个API函数的解释,下面的说明是从<Windows API参考大全>中截取出来的:
GetSystemMetrics
函数功能:返回与windows环境有关的信息。
函数原型:int GetSystemMetrics(int nIndex)
参数:
nIndex:常数,指定欲获取的信息。由于取值很多,所以在这里不一一列举了,本例子只用到两个常数值:
   SM_CXSCREEN:屏幕宽度。
   SM_CYSCREEN:屏幕高度。

GetWindowRect

函数功能:该函数返回指定窗口的边框矩形的尺寸。该尺寸以相对于屏幕坐标左上角的屏幕坐标给出。

函数原型:BOOL GetWindowRect(HWND hWnd,LPRECTlpRect);

参数:

hWnd:窗口句柄。

lpRect:指向一个RECT结构的指针,该结构接收窗口的左上角和右下角的屏幕坐标。

返回值:如果函数成功,返回值为非零:如果函数失败,返回值为零。

SetWindowPos

函数功能:该函数改变一个子窗口,弹出式窗口式顶层窗口的尺寸,位置和Z序。子窗口,弹出式窗口,及顶层窗口根据它们在屏幕上出现的顺序排序、顶层窗口设置的级别最高,并且被设置为Z序的第一个窗口。

函数原型:BOOL SetWindowPos(HWN hWnd,HWND hWndlnsertAfter,int X,int Y,int cx,int cy,UNIT.Flags);

参数:

hWnd:窗口句柄。

hWndlnsertAfter:在z序中的位于被置位的窗口前的窗口句柄。该参数必须为一个窗口句柄,或下列值之一:

  HWND_BOTTOM:将窗口置于Z序的底部。如果参数hWnd标识了一个顶层窗口,则窗口失去顶级位置,并且被置在其他窗口的底部。

  HWND_DOTTOPMOST:将窗口置于所有非顶层窗口之上(即在所有顶层窗口之后)。如果窗口己经是非顶层窗口则该标志不起作用。

  HWND_TOP:将窗口置于Z序的顶部。

  HWND_TOPMOST:将窗口置于所有非顶层窗口之上。即使窗口未被激活窗口也将保持顶级位置。

      查g看该参数的使用方法,请看说明部分。

x:以客户坐标指定窗口新位置的左边界。

Y:以客户坐标指定窗口新位置的顶边界。

cx:以像素指定窗口的新的宽度。

cy:以像素指定窗口的新的高度。

uFlags:窗口尺寸和定位的标志。

#include<windows.h>
#include<stdio.h>
#include"resource.h"
LRESULT CALLBACK wndporc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);

int WINAPI WinMain(
  HINSTANCE hInstance,      // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,          // command line
  int nCmdShow              // show state
)
{
	    HMENU hMenu;
		hMenu=hMenu=LoadMenu(hInstance,(LPCSTR)IDR_MENU1);
		WNDCLASS ws;
		ws.lpfnWndProc=wndporc;
		ws.cbClsExtra=0;
		ws.cbWndExtra=0;
		ws.hInstance=hInstance;
		ws.hIcon=LoadIcon(NULL,IDI_APPLICATION);
		ws.hCursor=LoadCursor(NULL,IDC_WAIT);
		ws.hbrBackground=CreateSolidBrush(RGB(255,0,0)); //创建笔刷函数
		ws.lpszMenuName="Menu"; //载入自定的菜单
		ws.lpszClassName="generic";
		ws.style=CS_HREDRAW|CS_VREDRAW;
		RegisterClass(&ws);
		HWND hwnd;
		hwnd=CreateWindow("generic","first",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,hMenu,hInstance,NULL);
		ShowWindow(hwnd,SW_NORMAL);
		UpdateWindow(hwnd);
		MSG msg;
		while(GetMessage(&msg,NULL,NULL,NULL))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		return 0;
}

LRESULT CALLBACK wndporc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
  )
{
	switch(uMsg)
	{
	case WM_CREATE: //设置窗口居中
		int scrWidth;
     	int scrHeight;
		RECT rect;
		//获得屏幕尺寸
		scrWidth=GetSystemMetrics(SM_CXSCREEN);
		scrHeight=GetSystemMetrics(SM_CYSCREEN);
	//获取窗体尺寸
			GetWindowRect(hwnd,&rect);
		rect.left=(scrWidth-rect.right)/2;
		rect.top=(scrHeight-rect.bottom)/2;
	//设置窗体位置
			SetWindowPos(hwnd,HWND_TOP,rect.left,rect.top,rect.right,rect.bottom,SWP_SHOWWINDOW);
		break;
	case WM_COMMAND://响应菜单消息
			if(IDM_FILE==wParam)
					MessageBox(hwnd, "This is help", NULL, MB_OK);
			else
				;

		break;
	case WM_CHAR:
		char szChar[20];
		sprintf(szChar,"char code is %d",wParam);
		MessageBox(hwnd,szChar,"char",MB_YESNO);
		break;
	case WM_LBUTTONDOWN:
		MessageBox(hwnd,"mouse clicked ","message",MB_YESNO);
		HDC hdc;
		hdc=GetDC(hwnd);
		TextOut(hdc,0,50,"zhoayuzen",strlen("zhoayghen"));
		ReleaseDC(hwnd,hdc);
		break;
	case WM_PAINT:
		HDC hDc;
		PAINTSTRUCT ps;
		hDc=BeginPaint(hwnd,&ps);
		TextOut(hDc,0,0,"nihao",strlen("nihao"));
		EndPaint(hwnd,&ps);
		break;
	case WM_CLOSE:
		if(IDYES==MessageBox(hwnd,"shi fou","messge",MB_YESNO))
		{
			DestroyWindow(hwnd);
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hwnd,uMsg,wParam,lParam);

	}
	return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值