Windows 程序设计笔记.doc

上传人:飞****2 文档编号:78749818 上传时间:2023-03-19 格式:DOC 页数:16 大小:105.50KB
返回 下载 相关 举报
Windows 程序设计笔记.doc_第1页
第1页 / 共16页
Windows 程序设计笔记.doc_第2页
第2页 / 共16页
点击查看更多>>
资源描述

《Windows 程序设计笔记.doc》由会员分享,可在线阅读,更多相关《Windows 程序设计笔记.doc(16页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、windows程序设计 笔记1 windows.h 中包含了 许多其他的头文件 主要是 WINUSER.H使用者界面 WINBASE.H kernel函数 WINDEF.H 一些类型的define WINNT.H 支持 UNICODE形态定义 WINGDI.H 包含图形界面函数 应用程序的入口函数 int WINAPI WinMain /WINAPI #define WINAPI _stdcall 标准调用约定 很多语言都是用的这种调用约定 (HINSTANCE hInstance, /实例的句柄 用于唯一标示应用程序 HINSTANCE hPrevInstance, /先前实例的句柄在win

2、 32 下为 0已经被摒弃 LPSTR lpCmdLine, /command line int nShowCmd ); /窗体的显示方式 UNICODE 是为了解决ASCII不能表示所有语言的问题 Windows 程序设计1、2章 windows.h 中包含了 许多其他的头文件 主要是 WINUSER.H 使用者界面 WINBASE.H kernel函数 WINDEF.H 一些类型的define WINNT.H 支持 UNICODE形态定义 WINGDI.H 包含图形界面函数 应用程序的入口函数 int WINAPI WinMain /WINAPI #define WINAPI _stdca

3、ll 标准调用约定 很多语言都是用的这种调用约定 (HINSTANCE hInstance, /实例的句柄 用于唯一标示应用程序 HINSTANCE hPrevInstance, /先前实例的句柄在win 32 下为 0已经被摒弃 LPSTR lpCmdLine, /command line int nShowCmd ); /窗体的显示方式 UNICODE 是为了解决ASCII不能表示所有语言的问题 wchar_t 原型 typedef wchar_t unsigned short ; /占2个字节也就是 16位 宽字 32位下 wchar_t * p=LDSAFAFD ; /L是long 告

4、诉编译器使用每一个字符占2个字节 wchar_t c=Lp; /定义宽字节 字符 即使不加L那么编译器也默认将她设置为2个字节 wcslen 求宽字节字符串的长度 不包括 0 wprintf 是printf的宽字原版 对应就有wscanf 这个是再 WCHAR.H中定义的 但是 有时候 我们 的程序需要 单字节 也需要双字节 那么 wchar_t和char 的 混合就混乱了 由于处理的函数 不用我们希望有一个可以同时处理他们的 类型 TCAR 如果定义了 _UNICODE 识别字那么就是 typedef wchar_t TCHAR 如果没定义的 typedef char TCHAR 具体看 T

5、CHAR.H源文件 #define _T(x) _T(x)#define _TEXT(x) _T(x) 在TCHAR.H中这样定义了 就是 说我们可以用 _T _T _TEXT中的任意一种 。 对应求字符个数的函数 就是 _tcslen () 如果定义了 _UNICODE 那么就是 #define _tcslen wcslen 否则 #define _tcslen strlen 如果要使用_UNICODE 识别那么 就在 Project -Setting-c/c+ Language - Preprocessor Definition中加上 _UNICODE 那么 系统的 就会默认使用_UNIC

6、ODE 识别类型 在 WINNT.H 中增加了新的 类型定义 CTYPE.H 中定义了 wchar_t 为unsigned int typedef char CHAR ;typedef wchar_t WCHAR ; 实际上 MessageBox这个函数 并不是真正的 消息框原型 在WINUSER.H中我们找不到 MessageBox的函数定义 也就是说没有 MessageBox的函数进入点 但是 我们发现 有 MessageBoxA 和 MessageBoxW 这两个 函数 一个表示单字节 一个表示宽字 我们在使用时直观调用 MessageBox就行了 因为 #ifdef UNICODE#d

7、efine MessageBox MessageBoxW /如果定义了UNICODE 那么 就是用MessageBoxW #else#define MessageBox MessageBoxA#endif / !UNICODE 非UNICODE 的时候调用的是MessageBoxA 这样的好处是一旦定义了 UNICODE 那么全都是UNICODE 表示 MessageBoxW否则就是 MessageBoxA还有 windows定义了一组与 C语言字符串处理函数相当的函数ILength = lstrlen (pString) ;pString = lstrcpy (pString1, pStri

8、ng2) ;pString = lstrcpyn (pString1, pString2, iCount) ;pString = lstrcat (pString1, pString2) ;iComp = lstrcmp (pString1, pString2) ;iComp = lstrcmpi (pString1, pString2) ; 这些函数 其实和 TCHAR 一样的用法 如果定义了UNICODE 就是 那么这些函式将接受宽字串,否则只接受常规字串。 windows中不可以使用 printf 但是可以使用sprintf进行格式化文本int sprintf (char * szBuf

9、fer, const char * szFormat, .)int iReturn ;va_list pArgs ;va_start (pArgs, szFormat) ;iReturn = vsprintf (szBuffer, szFormat, pArgs) ;va_end (pArgs) ;return iReturn ;标准版 sprintf swprintf _stprintf 我们可以对宽字 单字节的字符进行格式化 Windows 程序设计3、4章笔记 #include windows.h#include stdio.h#include stdlib.h #include res

10、ource.h /预编译我们的资源文件#include tchar.hLRESULT 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.cbC

11、lsExtra=0 ;cls.cbWndExtra=0 ;cls.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH) ; cls.hCursor=LoadCursorFromFile(resourcexx.ani) ;cls.hIcon=LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1) ;cls.hInstance=hInstance ;cls.lpfnWndProc=MyProc ;cls.lpszClassName=szAppName;cls.lpszMenuName=NULL;cls.style=C

12、S_HREDRAW|CS_VREDRAW| 0x; /CS_DROPSHADOW 0x在 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(

13、&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 ;

14、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 FileEndPaint(hwnd,&ps) ;return 0 ;case WM_CREATE : /当窗体创建的时候 是 窗口过程接受的第一个消息 /SetWindowLong(hwnd,GWL_STYLE,(GetWindowLCong(hwnd,GWL_STYLE)&WS_CAPTION);

15、 /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立

16、即更新窗口 /也就是 说 在调用了 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); /向消息队列中发送一个

17、退出消息 return 0; return DefWindowProc(hwnd,uMsg,wParam,lParam) ; /返回缺省的窗口过程windows程序设计 第五章笔记 GDI(1) 我们在对 windows 设备进行绘图操作的时候要用到 GDI 函数 并且要获取 设备的 DC 也就是设备的代号 如果是响应WM_PAINT 消息 那么 我们利用 BeginPaint .code EndPaint 获取设备上下文代号 如果处理的不是 WM_PAINT 消息 那么 就利用 GetDC .code ReleaseDC /释放DC如果我们要获取整个视窗的DC那么用 GetWindowDC如

18、果要获取 Client Area的DC那么用GetClientDC 来获取 但是最后都要掉哟过ReleaseDC来释放设备上下文 在MSDN我们可以看到 我们在 GetDC后 一定要调用 ReleaseDC 而一定不能调用 DeleteDC DeleteDC是 在 CreateDC后调用的 。hdcMem = CreateCompatibleDC (hdc) ; /兼容DC其他行程式DeleteDC (hdcMem) ; hdcMeta = CreateMetaFile (pszFilename) ; 其他行程式hmf = CloseMetaFile (hdcMeta)int GetDevic

19、eCaps( HDC hdc, / handle to DC int nIndex / index of capability); 获得设备的信息 SetPixel 绘制一个点 GetPixel 可以返回指定设备指定坐标上的点的颜色 BOOL Polyline( /这个函数的功能是可以将多个点连续的画起来HDC hdc, / handle to device context CONST POINT *lppt, / array of endpoints /POINT 结构体数组 int cPoints / number of points in array); /POINT 结构体数组的个数

20、Rectangle、矩形Ellipse、 绘制椭圆 RoundRect 绘制一个边角圆滑的椭圆BOOL RoundRect( HDC hdc, / handle to DCint nLeftRect, / x-coord of upper-left corner of rectangle int nTopRect, / y-coord of upper-left corner of rectangle int nRightRect, / x-coord of lower-right corner of rectangleint nBottomRect, / y-coord of lower-r

21、ight corner of rectangleint nWidth, / width of ellipse /值越大 边角就越明显 int nHeight / height of ellipse); /值越大 边角就越明显 Chord 绘制一个弦Pie 饼图函数绘 制一个扇形楔,由一个椭圆形和两个子午线轮胎的交集范围内。通过使用当前画笔的馅饼概述,并通过使用当前画笔填充。Arc 绘制一个椭圆弧PolyBezier 贝塞尔曲线 PolyBezierTo 也是画贝塞尔曲线在绘制线的时候对画笔的 设置 HPEN pen ;pen=GetStockObject (WHITE_PEN) ;Select

22、Object(hdc,pen) ;/ 这样就 为我们的设备上下文设置了白色的画笔 选择的时候必须用 GetStockObject获取画笔 受限与 windows的几种画笔 我们可以通过函数创建自己的画笔 CreatePen 或者 CreatePenIndirect 使用完了之后 我们需要DelectObject删除 逻辑画笔 这是一种GDI物件 其他的物件有 其他五种是画刷、点阵图、区域、字体和调色盘。除了调色盘之外,这些物件都是通过SelectObject选进装置内容的。hPen =CreatePen(PS_DASH,1,RGB(122,233,55);SelectObject (hdc,h

23、Pen) ; /这个例子创建了一个浅绿色的画笔 DeleteObject(hPen) ; /删除创建的GDI物件 也就是逻辑画笔 ClentToScreen 是客户坐标到屏幕的转换 ScreenToClient是屏幕到客户的转换 GetWindowRect是相对于 屏幕的左上角的(0,0)创建逻辑画笔的第二种方法 LOGPEN logpen ;hPen = CreatePenIndirect (&logpen) ; DeleteObject(logpen); /可以在响应WM_DESTROY的时候 删除画笔 int GetObject( HGDIOBJ hgdiobj, / handle to

24、 graphics object int cbBuffer, / size of buffer for object information LPVOID lpvObject / buffer for object information);这个函数的用法是 如果 我们有位图或者 画笔 或者。的句柄那么我们能获得对应的 GDI对象的信息 如果需要目前选进装置内容的画笔代号,可以呼叫: 也就是我们要获取当前设备的画笔句柄 也可以获取其他句柄 具体看MSDN函数的介绍 hPen = GetCurrentObject (hdc, OBJ_PEN) ;在画虚线的时候我们也可以 用 SetBkColor

25、填充 虚线的空白地方 SetBkMode(TRANSPARENT) ;会设置 背景模式为透明的 。 GetBkMode 可以获取现在的背景模式 也就是返回 SetBkMode设置的背景参数 GetObject喝 GetCurrentObject的区别 GetObject是通过句柄获取 设备的属性 GetCurrentObject是获取当前设备的句柄 通过参数 。函式图形Rectangle直角矩形Ellipse椭圆RoundRect圆角矩形Chord椭圆周上的弧,两端以弦连接Pie椭圆上的圆形图Polygon多边形 MSDNPolyPolygon多个多边形 N个SetPolyFillMode (

26、hdc, iMode) ; 设置多边形填充模式 如果我们要对背景进行填充那么就要创建画刷了 画刷 句柄HBRUSH 可以用到 CreateSolidBrush (crColor) ; 函数 和 CreateHatchBrush (iHatchStyle, crColor) ; 带斜线的画刷 hBrush = CreateBrushIndirect (&logbrush) ; 间接的创建画刷 如果要取得画刷的 信息一样可以调用 GetObject来实现 我们还可以选择坐标的映射方式 SetMapMode (hdc, iMapMode ) /那么 我们可以设置 x y坐标的初始起点 同样 有Set

27、就对应有GetMapMode 还有一些常用的函数 GetTextExtend 获取一段文本的信息 GetTextMetrics 获取系统文本度量 GetSystemMetrics 获取系统的度量GetDeviceCaps 获取设备信息 GetCursorPos 获取鼠标位置 SetCursor set鼠标位置MoveWindow 移动窗体 GetWindowRect 获取窗体的举行 相当于 DesktopGetClientRect 获取客户区域的举行相对于windowScreenToClient ClientToScreen 客户 屏幕坐标的转换 DptoLP函数功能:该函数将设备坐标转变为逻

28、辑坐标,转变依赖于设备的图形模式,窗口和坐标的起点及范围的设置,和转换的内容。 SetRect设置 举行的值 PeekMessage和GetMessage有类似的功能但是不同的是 PeekMessage可以对消息进行处理 例如从消息队列中国删除消息 建立剪裁区域 HRGN 也是GDI物件 之一也可以调用DeleteObject删除 创建剪裁区域的2中方法 hRgn = CreateRectRgn (xLeft, yTop, xRight, yBottom) ;或者hRgn = CreateRectRgnIndirect (&rect) ;您也可以建立椭圆剪裁区域:hRgn = CreateEl

29、lipticRgn (xLeft, yTop, xRight, yBottom) ;或者hRgn = CreateEllipticRgnIndirect (&rect) ;windows程序设设计(2) SDK贴图 下面是2个加载位图的函数 HBITMAP LoadBitmap( HINSTANCE hInstance,/ handle to application instance 应用程序的句柄LPCTSTR lpBitmapName / name of bitmap resource); /位图资源的 ID这个函数可以夹杂一张位图并且返回 位图资源的 句柄 但是 推荐使用新的 LoadI

30、mage函数 这个函数可以从磁盘文件加载图片 HANDLE LoadImage( HINSTANCE hinst, / handle to instance handleLPCTSTR lpszName,/ image to load 要加载的图片UINT uType, / image type 加载的图片类型int cxDesired,/ desired width 宽度 int cyDesired,/ desired height 高度 UINT fuLoad / load options); 加载选项 可以选择从LOADFROMFAILE 从文件加载BOOL BitBlt( HDC hd

31、cDest,/ handle to destination DC 目的设备的DCint nXDest, / x-coord of destination upper-left corner 目的DC的xint nYDest, / y-coord of destination upper-left corner yint nWidth,/ width of destination rectangle 宽int nHeight,/ height of destination rectangle 高 HDC hdcSrc, / handle to source DC 源兼容DCint nXSrc,

32、/ x-coordinate of source upper-left corne int nYSrc, / y-coordinate of source upper-left corner DWORD dwRop / raster operation code); 操作方式兼容DC 是GDI物件之一 可以利用 CreateCompatibleDC来创建 与 目的DC 相兼容的 DC 然后 我们利用 SeleteObject 将位图选到 兼容DC中使用完了之后要DeleteObject删除 BitBlt 函数可以将兼容DC中的位图资源Copy到 目的DC 拷贝过程中设计到 WM_ERASEBK

33、GND消息 喝 WM_PAINT消息的处理关系Windows程序设计 键盘 分类: C+ MFC API 2011-10-21 20:30 118人阅读 评论(0) 收藏 举报 窗体在失去焦点的时候发出 WM_WM_KILLFOCUS 窗体在获得焦点的时候会发出 WM_GETFOCUS 只有活动视窗 会受到键盘消息 受到键盘消息的窗体可以是 活动窗体 也可以是活动窗体的 子窗体 也可以是活动窗体的 衍生窗体 字元信息 例如 A按下了 既有字元信息也有按键信息 Alt + F4按下了只有按键信息 没有字元信息 系统键 带Alt的键 通常有 DefWindowProc处理 键按下键释放非系统键WM

34、_KEYDOWNWM_KEYUP系统键WM_SYSKEYDOWNWM_SYSKEYUP通常 WM_KEYDOWN和WM_KEYUP或者 (WM_SYSKEYDOWN WM_SYSKEYUP) 成对出现 我们可以调用 GetMessageTime 来获取键盘按下 和 弹起的相对时间 case WM_SYSKEYDOWN:case WM_SYSKEYUP:case WM_SYSCHAR:return 0 ; /拦截系统消息 虚拟键码保存在WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN和WM_SYSKEYUP讯息的wParam参数中十进位十六进位WINUSER.H识别字必需?IB

35、M相容键盘101VK_LBUTTON滑鼠左键202VK_RBUTTON滑鼠右键303VK_CANCELCtrl-Break404VK_MBUTTON滑鼠中键十进位十六进位WINUSER.H识别字必需?IBM相容键盘112-12170-79VK_F1到VK_F10功能键F1到F10122-1357A-87VK_F11到VK_F24功能键F11到F2414490VK_NUMLOCKNum Lock14591VK_SCROLLScroll Lock以上是一些虚拟键 我们可以在使用的时候参考我们可以获取 键的状态 判断键是否被按下了 例如 : GetKeyState()根据返回值我们可以判断一个键是

36、按下了还是抬起了 如果按下了 那么返回值是负值 SHORT GetKeyState( /具体看MSDN int nVirtKey / virtual-key code /虚拟码); 千万不要 while(GetKeyState(VK_F1)=0) ;/那么程序会立即 卡死 。因为 如果键盘不按下 那么 返回值将一直为 TRUE 进入死循环 除非设置多线程WM_VSCROLLWM_HSCROLL 是水平垂直滚动条的 消息响应关于消息的附加参数我们可以参考MSDNwhile(GetMessage (&msg, NULL, 0, 0)TranslateMessage (&msg) ;Dispatch

37、Message (&msg) ;这是WinMain中典型的讯息回圈。GetMessage函式用伫列中的下一个讯息填入msg结构的栏位。DispatchMessage以此讯息为参数呼叫适当的视窗讯息处理程式。在这两个函式之间是TranslateMessage函式,它将按键讯息转换为字元讯息。如果讯息为WM_KEYDOWN或者WM_SYSKEYDOWN,并且按键与位移状态相组合产生一个字元,则TranslateMessage把字元讯息放入讯息伫列中。此字元讯息将是GetMessage从讯息伫列中得到的按键讯息之後的下一个讯息。十进位十六进位WINUSER.H识别字必需?IBM相容键盘808VK_B

38、ACKBackspace909VK_TABTab120CVK_CLEARNum Lock关闭时的数字键盘5130DVK_RETURNEnter (或者另一个)1610VK_SHIFTShift (或者另一个)1711VK_CONTROLCtrl (或者另一个)1812VK_MENUAlt (或者另一个)1913VK_PAUSEPause2014VK_CAPITALCaps Lock271BVK_ESCAPEEsc3220VK_SPACESpacebar,数字和字母的虚拟键码是ASCII码。Windows程式几乎从不使用这些虚拟键码;实际上,程式使用的是ASCII码字元的字元讯息。十进位十六进位

39、WINUSER.H识别字必需?IBM相容键盘96-10560-69VK_NUMPAD0到VK_ NUMPAD9NumLock打开时数字键盘上的0到91066AVK_MULTIPLY数字键盘上的*1076BVK_ADD数字键盘上的+1086CVK_SEPARATOR1096DVK_SUBTRACT数字键盘上的-1106EVK_DECIMAL数字键盘上的.1116FVK_DIVIDE数字键盘上的/表6-5十进位十六进位WINUSER.H识别字必需?IBM相容键盘48-5730-39无主键盘上的0到965-9041-5A无A到Z同一个视窗讯息处理程式可能会用到两个视窗类别,一个用RegisterCl

40、assA注册,而另一个用RegisterClassW注册。也就是说,视窗讯息处理程式可能会获得一些ANSI字元代码讯息和一些Unicode字元代码讯息。如果您的视窗讯息处理程式需要晓得目前视窗是否处理Unicode讯息,则它可以呼叫:fUnicode = IsWindowUnicode (hwnd) ;如果hwnd的视窗讯息处理程式获得Unicode讯息,那么变数fUnicode将为TRUE,这表示视窗是用RegisterClassW注册的视窗类别。LRESULT CALLBACK WindowProc( HWND hwnd, / handle to window UINT uMsg, / WM_KEYDOWN WPARAM wParam, / virtual-key code /虚拟码LPARAM lParam / key data); /扫描码 Windows程序设计 -鼠标 GetSystemMetrics(SM_CYCAPTION) /可以获得 标题栏的 高度 GetSystemMetrics(SM_CMOU

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com