第四次毕业设计任务书

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

 

posted @ 2017-04-01 11:05  看物是人非  阅读(203)  评论(1编辑  收藏  举报