windows程序设计读书笔记一
用VC MFC有一段时间了,总觉得还没掌握到精髓,项目代码基本是拼凑起来的。总是少点什么。前段时间,看完 快乐鹦鹉 的程序人生, 里面提到 全局变量 的一段。突然想到自己用 vc+opencv的一个小项目, 那里面真可谓 全局变量满天飞啊,只要是mat 的变量都成了全局变量,方便访问。总觉得自己以前写程序,纯属为写而写, 只要能达到目标,怎么直接怎么来,很是野蛮的方式。对写程序缺乏一个系统的研究,基础不牢固。很有必要,系统的看看相关书籍了。
1、注册窗口类时,类的名称不能重复,当前面已经注册了一个名字的类(lpszClassName),后面的窗口类就不能再用这个名字了。
以下代码用 szAppName[] 及szAppName1[] 放置两个类名字符串,若szAppName1[] 的内容与szAppName[]一样时,在第二次注册时不会成功,由GetLastError()的返回值是1410 可以到 〖1410〗-类别已存在。
#include <windows.h>
#include <tchar.h>
#include <mmsystem.h>
#pragma comment(lib, "WINMM.LIB")LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{static TCHAR szAppName[] = TEXT ("HelloWin") ;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 ;static TCHAR szAppName1[] = TEXT("HelloWin");HWND hwnd1;WNDCLASS wndclass1;wndclass1.style = CS_HREDRAW | CS_VREDRAW;wndclass1.lpfnWndProc = WndProc;wndclass1.cbClsExtra = 0;wndclass1.cbWndExtra = 0;wndclass1.hInstance = hInstance;wndclass1.hIcon = LoadIcon(NULL, IDI_APPLICATION);wndclass1.hCursor = LoadCursor(NULL, IDC_WAIT);wndclass1.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);wndclass1.lpszMenuName = NULL;wndclass1.lpszClassName = szAppName1;if (!RegisterClass (&wndclass)){MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ;return 0 ;}if (!RegisterClass(&wndclass1)){GetLastError();MessageBox(NULL, TEXT("This program requires Windows NT!"),szAppName1, MB_ICONERROR);return 0;}hwnd = CreateWindow (szAppName, // window class nameTEXT ("The Hello Program"), // window captionWS_OVERLAPPEDWINDOW, // window styleCW_USEDEFAULT, // initial x positionCW_USEDEFAULT, // initial y positionCW_USEDEFAULT, // initial x sizeCW_USEDEFAULT, // initial y sizeNULL, // parent window handleNULL, // window menu handlehInstance, // program instance handleNULL) ; // creation parametersShowWindow (hwnd, iCmdShow) ;UpdateWindow (hwnd) ;hwnd1 = CreateWindow(szAppName1, // window class nameTEXT("The Hello Program1"), // window captionWS_OVERLAPPEDWINDOW, // window styleCW_USEDEFAULT, // initial x positionCW_USEDEFAULT, // initial y positionCW_USEDEFAULT, // initial x sizeCW_USEDEFAULT, // initial y sizeNULL, // parent window handleNULL, // window menu handlehInstance, // program instance handleNULL); // creation parametersShowWindow(hwnd1, iCmdShow);UpdateWindow(hwnd1);while (GetMessage (&msg, NULL, 0, 0)){TranslateMessage (&msg) ;DispatchMessage (&msg) ;}return msg.wParam ;
}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{HDC hdc ;PAINTSTRUCT ps ;RECT rect ;switch (message){case WM_CREATE:PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;return 0 ;case WM_PAINT:hdc = BeginPaint (hwnd, &ps) ;GetClientRect (hwnd, &rect) ;TextOut(hdc, 0, 0, _T("您好!测试一下数量"), 9);DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;EndPaint (hwnd, &ps) ;return 0 ;case WM_DESTROY:PostQuitMessage (0) ;return 0 ;case WM_LBUTTONDOWN:PlaySound(TEXT("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC);return 0;}return DefWindowProc (hwnd, message, wParam, lParam) ;
}
2、上述程序TextOut(hdc,0,0,_T("您好!测试下数量"),9) 针对函数TextOut的试验。
a、TextOut并不认为字符串尾部值为0字节表示字符串的结束,它利用iLength参数来决定字符串的长度,把9该大时将会出现乱码
b、去掉_T() ,也是出现乱码, unicode双字节字符串。
c、确定打印个数时,可以使用 lstrlen() 获得;
3、消息中处理的变量,若是有连续性或其他地方需要使用,该变量应声明为静态变量。因为消息结束时,消息中的变量也会随之释放,将上面的回调函数改为:
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{HDC hdc ;PAINTSTRUCT ps ;RECT rect ;TCHAR szAppName[] = TEXT("大王叫我来寻山!");static int lButtonDownTimes = 0;int rButtonDownTimes = 0;static TCHAR timesDown[100];static TCHAR timesRDown[100];switch (message){case WM_CREATE:PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;return 0 ;case WM_PAINT:hdc = BeginPaint (hwnd, &ps) ;GetClientRect (hwnd, &rect) ;TextOut(hdc, 0, 0, timesDown, 10);TextOut(hdc, 0, 10, timesRDown, 10);DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;EndPaint (hwnd, &ps) ;return 0 ;case WM_DESTROY:PostQuitMessage (0) ;return 0 ;case WM_LBUTTONDOWN:wsprintf(timesDown, _T("左键按下次数:%d"), lButtonDownTimes);InvalidateRect(hwnd,NULL,TRUE);lButtonDownTimes++;return 0;case WM_RBUTTONDOWN:wsprintf(timesRDown, _T("右键按下次数:%d"), rButtonDownTimes);InvalidateRect(hwnd, NULL, TRUE);rButtonDownTimes++;return 0;}return DefWindowProc (hwnd, message, wParam, lParam) ;
}
分别点击鼠标左键和右键能清楚的看到 局部变量 和全局变量的影响。
上述函数在鼠标点击的消息内,调用了 InvalidateRect(hwnd,NULL,TRUE)使得整个窗口无效,InvalidateRect函数会生成WM_PAINT消息。
关于第5章P107对 TextOut的使用
TextOut (hdc, 14*cxCaps+35*cxChar, cyChar*i, szBuffer,
wsprintf (szBuffer, TEXT ("%5d"),GetDeviceCaps (hdc, devcaps[i].iIndex))) ;
wsprintf 函数的返回值就是字符串的长度。
windows程序设计读书笔记一相关推荐
- MFC Windows程序设计 读书笔记2
Windows中负责图形输出的是Graphics Device Interface(图形设备接口),或称GDI.本节主要讲述CDC类和它的继承类,并介绍三种最常用的GDI基本元素,画笔.画刷.和字体, ...
- Windows程序设计 读书笔记(3)
第三章 窗口与消息 3.1 窗口的创建 用户对窗口的输入以'消息'的形式传递给窗口,而窗口也借助消息来与其他窗口进行通信.例如当用户改变窗口的尺寸时,Windows便向应用程序发送一条携带新窗口尺寸相 ...
- windows程序设计读书笔记四
前面的程序碰到刷新时碰到闪烁问题,百度一搜,一堆关于双缓冲解决闪烁的文章. 具体实施方案为: 1.建立一个内存DC hdcMem = CreateCompatibleDC(hdc); 此时,内存DC的 ...
- Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据
Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据 Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据 7.1 程序数据的命名 PL/SQL要求在给数据结构命名的时候应 ...
- Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理
Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 ACID原则:即一个事务具有原子性.一致性. ...
- PHP程序设计读书笔记七
一.比较字符串: 1."=="和"==="的区别: "=="在比较之前会先把非字符串类型的操作数转换成字符串,所以"3" ...
- 电子数据取证Windows取证读书笔记
电子数据取证第六章Windows取证读书笔记 其实Windows的取证可以依靠像美亚的取证大师这类取证软件来进行. 这类软件可以完成大多数的取证需要 用户目录: WindowsXP----Docume ...
- Windows程序设计学习笔记(1):一个简单的windows程序
<Windows程序设计>(第五版)(美Charles Petzold著) 1 #include<windows.h> 2 3 LRESULT CALLBACK WndProc ...
- c语言程序设计读书笔记3000字,C语言程序设计读书笔记题目
读书笔记注意事项: 1. 读书笔记要求至少有六个题目,在一类.二类.三类题目中各选两题,具体题目选择由学生自行选择. 2. 每个题目必须包含所选题目,以及具体题目的程序实现过程,要求每行语句后都需要有 ...
最新文章
- 十一运夺金基础数据采集工具
- python linux编程与window编程_Python实现Windows和Linux之间互相传输文件(文件夹)的方法...
- MySQL下载与配置
- usaco2.1.2(frac1)
- 基因分子生物学~tRNA,mRNA,蛋白质合成
- C++将类的构造函数、析构函数声明为private或者protected的用途
- mysql log_来吧,了解下mysql有哪些log
- android端和javaWeb端实现Mqtt消息推送
- 如何才能成为高级Java开发工程师
- Python爬虫爬取微博热搜保存为 Markdown 文件
- Vue进阶之表单控件绑定
- vgg19-dcbb9e9d.pth文件网盘下载
- 软考信息安全工程师知识总结
- MCU程序布局----优化升级方式
- 手动档科目三考试过程
- 什么叫手机或设备的ID
- JAVA计算:用 100 元钱买 100 支笔,其中钢笔 3 元 / 支,圆珠笔 2 元 / 支,铅笔 0.5 元 / 支,问钢笔、圆珠笔和铅笔可以各买多少支 ?
- 工艺角(process corner)
- 【4天快速入门Python数据挖掘之第1天】Matplotlib的使用
- 公司职员信息管理系统