第四次毕业设计任务书
1.以后每周具体任务暂定如下:
计划安排时间 | 计划完成内容 | 是否完成 |
2017.03.11~2017.04.14(4-8周) |
1.继续学习相关内容,并实际用到开发环境中去编写测试代码; 2.把核心代码写好; 3.并开始准备毕业论文; |
进行中 |
第六周 |
研究图形化界面的编写,把相应功能用GUI界面显示。 |
完成 |
第七周 | 继续上周的内容,研究图形化界面显示信息。(因为难度就在这里,动态实时显示数据信息之类的) | 待完成 |
第八周 |
1.继续编写代码 2.开始准备毕业论文 |
待完成 |
第九周 |
1.完成1.0版本 2.着手编写毕业论文 |
待完成 |
第十周 |
1.修改程序bug、优化程序等 2.补充完善论文 |
待完成 |
第十一周 |
1.完成最终版本的程序 2.补充完善论文 |
待完成 |
第十二周 |
完成毕业论文 |
待完成 |
第十三周 |
做好相关答辩准备 |
待完成 |
第十四周 |
答辩 |
待完成 |
2.本周任务:
本周主要是对程序的图形化界面进行编写,本来一开始想用第三方图形库进行编写,却发现没有必要,因为之前有学习过windows程序设计,就是Win32的程序设计,直接通过windows自带GDI创建窗口,没有借助第三方图形库进行绘制,查了相关资料,知道了怎么设置窗口的透明度,详细情况如3所示。
3.代码及效果展示:
由于之前有学习过windows程序设计,还记得win32的编程思想,但是我总觉得使用标准那一贯的编程套路很不自由,就像被限制活动一般,编写的代码都必须按它的套路出牌,而且我的这个程序没有处理多少消息,感觉不使用这个模式来写更方便。当然我是在得知不使用WinMain函数作为程序入口也可以创建窗口程序后才敢这样说的哈哈。
直接可以使用main函数作为程序入口,然后接下来还是需要创建窗口的必要条件:创建窗口类,注册窗口类,创建窗口,显示窗口。
代码如下:
#include <windows.h> #include <stdio.h> int main() { //创建窗口类 WNDCLASS wc = {0}; wc.style = CS_OWNDC; wc.hInstance = GetModuleHandle(NULL); wc.lpfnWndProc = DefWindowProc; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL , IDC_ARROW); wc.lpszClassName = "test"; if (!RegisterClass(&wc)) return 0; //注册窗口类 //创建窗口 HWND hwnd = CreateWindow( wc.lpszClassName , wc.lpszClassName , WS_CAPTION|WS_SIZEBOX,200,50,200,400,0,0,wc.hInstance,0); if(hwnd == NULL) return 0; ShowWindow(hwnd, SW_NORMAL); // 最后显示窗口,使修改生效 for(int i=0;;i++) //不让主线程挂掉 { HDC dc=GetDC(hwnd); //开始绘制 TextOut(dc,20,100,"窗口测试",8);//显示信息 ReleaseDC(hwnd,dc);//结束绘制 if(i % 10 ==0 ) Sleep(50); //防止cpu占用过高 等待频率 50ms * 10 } }
效果截图:
接下来便是对窗口的界面的透明度进行调整,用到了 SetWindowLong 这个函数,可以用来设置窗口的一些属性,在使用 SetLayeredWindowAttributes 设置窗口的透明度:
SetWindowLong 函数:
LONG SetWindowLong( HWND hWnd, int nIndex, LONG dwNewLong ); /* 第一个参数表示窗口句柄。 第二个参数代表要设置的哪一种值,如GWL_STYLE表示将设置窗口的风格,这个参数还可以取GWL_EXSTYLE,GWL_WNDPROC,DWL_DLGPROC,GWL_HINSTANCE,GWL_USERDATA等等。 第三个参数表示要设置的值。 */
SetLayeredWindowAttributes:
BOOL SetLayeredWindowAttributes( HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags ); /* 第一个参数表示窗口句柄。 第二个参数表示透明色。 第三个参数表示透明度。 第四个参数表示函数将完成什么样的功能,设置成LWA_COLORKEY表示为窗口指定了透明色,设置成LWA_ALPHA表示将调整窗口的透明度,可以同时设置这两种功能。 */
示例:
#include <windows.h> #include <stdio.h> //因为没有了消息捕获 相当于捕获消息 用来检测按键是否按下 #define KeyTest(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) int main() { WNDCLASS wc = {0}; wc.style = CS_OWNDC ; wc.hInstance = GetModuleHandle(NULL); wc.lpfnWndProc = DefWindowProc; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL , IDC_ARROW); wc.lpszClassName = "test"; if (!RegisterClass(&wc)) return 0; HWND hwnd = CreateWindow( wc.lpszClassName , wc.lpszClassName , WS_POPUP,200,50,200,400,0,0,wc.hInstance,0); if(hwnd == NULL) return 0; //SetWindowLong可以用来设置窗口的一些属性,透明 , WS_EX_TRANSPARENT = 鼠标穿透 , WS_EX_TOOLWINDOW = 不要在任务栏和 ALT+TAB 里显示 SetWindowLong ( hwnd , GWL_EXSTYLE ,WS_EX_TRANSPARENT + 0x80000 + WS_EX_TOOLWINDOW); // SetLayeredWindowAttributes(hwnd, RGB(255,255,255) , 0 , 1); //此函数在VC6.0中没有声明,需要自定义后在user32.dll后动态获取地址后调用。 // 在VC9.0(VS2008)及其之后版本中可以直接调用 ( (BOOL(WINAPI*)(HWND,COLORREF,BYTE,DWORD)) GetProcAddress(LoadLibrary("user32.dll") , "SetLayeredWindowAttributes") ) (hwnd , RGB(255,255,255) , 100 , 1); ShowWindow(hwnd, SW_NORMAL); // 最后显示窗口,使修改生效 for (int i = 0;;i++) { HDC dc = GetDC(hwnd);//开始绘制 TextOut(dc,20,100,"窗口测试",8); ReleaseDC(hwnd,dc);//结束绘制
//等待时间 50ms * 10 没有用Sleep(500) 是因为要检测按键 不能让sleep时间太长 否则有时按的时候刚好在sleep导致不会响应
if (i%10 == 0) Sleep(50);
if(KeyTest(VK_ESCAPE)) {return 0 ;} //按键ESC退出 } }
效果截图:
4.心得与体会:
虽然窗口的透明只用简单几个函数就可以实现,但是要实现动态显示感觉还是比较麻烦的,我还在查阅相关资料,不过已经有一些进展了,下次一起把进展结果贴出来。
5.参考文献:
位图背景与位图画刷:http://blog.csdn.net/morewindows/article/details/8451629
透明窗体:http://blog.csdn.net/morewindows/article/details/8451632