Windows 程序设计3、4章笔记
#include "windows.h"
#include "stdio.h"
#include "stdlib.h"
#include "resource.h" //预编译我们的资源文件
#include "tchar.h"
LRESULT CALLBACK MyProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{ HWND hWnd ;
MSG msg ;
static TCHAR szAppName[] = TEXT ("NewWindow") ; //窗口类名
WNDCLASS cls ;
cls.cbClsExtra=0 ;
cls.cbWndExtra=0 ;
cls.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH) ;
cls.hCursor=LoadCursorFromFile("resource\\xx.ani") ;
cls.hIcon=LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)) ;
cls.hInstance=hInstance ;
cls.lpfnWndProc=MyProc ;
cls.lpszClassName=szAppName;
cls.lpszMenuName=NULL;
cls.style=CS_HREDRAW|CS_VREDRAW| 0x00020000; //CS_DROPSHADOW 0x00020000在 vc6 以及以前的版本中没有定义 我们可以自定义 这个窗体有阴影
RegisterClass(&cls) ;
hWnd=CreateWindow("NewWindow","SDK_Window Demo",WS_TABSTOP|WS_HSCROLL|WS_VSCROLL|WS_SYSMENU ,200,200,500,400,NULL,NULL,hInstance,NULL) ;
ShowWindow(hWnd,SW_SHOWNORMAL) ;
UpdateWindow(hWnd) ;
while(GetMessage(&msg,NULL,0,0)) //获得消息 后面2个参数为0会接受任何 win32消息
{
TranslateMessage(&msg) ; //翻译消息
DispatchMessage(&msg) ;//分发消息
}
return 0;
}
LRESULT CALLBACK MyProc(
HWND hwnd,
UINT uMsg, //win32消息的类型
WPARAM wParam, //第一个附加参数
LPARAM lParam //第二个附加参数一般是值
)
{
switch (uMsg)
{
case WM_PAINT : //UpdateWindow函数的调用会进入这个消息响应
{
HDC dc ;
PAINTSTRUCT ps ;
dc=BeginPaint(hwnd,&ps) ;
SetTextAlign(dc,TA_LEFT|TA_TOP) ; //设置基点的位置 。。也就是坐标(0,0)
TextOut(dc,60,60,_T("GameWnd"),lstrlen(_T("GameWnd")));//include TCHAR.H Head File
EndPaint(hwnd,&ps) ;
return 0 ;
}
case WM_CREATE : //当窗体创建的时候 是 窗口过程接受的第一个消息
{
// SetWindowLong(hwnd,GWL_STYLE,(GetWindowLCong(hwnd,GWL_STYLE)&~WS_CAPTION)); //SetWindowLong 设置窗体的style
SetScrollRange(hwnd,SB_HORZ,0,100,FALSE) ; //SetScrollRange 设置 滚动条的范围 是min-max
SetScrollPos(hwnd,SB_HORZ,50,FALSE) ; // SetScrollPos设置滚动条的位置 是相对与 min-max中的位置 最后一个参数设置为false表示不需要重绘
//InvalidateRect会使客户区域变为 Invalid Area 从而向消息队列中加入 WM_PAINT 消息但始终合格消息的优先级较低 但是我们可以调用 UpdateWindow立即更新窗口
//也就是 说 在调用了 InvalidateRect 时候接着调用 UpdateWindow 才会立即重绘
//新的函数 GetScrollInfo 和 GetScrollInfo函数可以完成上述四个函数的功能具体应用 MSDN
return 0 ;
}
case WM_CHAR :
{
if('Q'==(char)wParam)
if(IDYES==MessageBox(hwnd,_T("是否要退出?"),_T("提示"),MB_YESNO) )
{
DestroyWindow(hwnd) ; //销毁窗体
}
return 0 ;
}
case WM_DESTROY:
{
PostQuitMessage(0); //向消息队列中发送一个退出消息
return 0;
}
}
return DefWindowProc(hwnd,uMsg,wParam,lParam) ; //返回缺省的窗口过程
}