青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

mantian

統(tǒng)計

留言簿(2)

閱讀排行榜

評論排行榜

WindowsSDK入門系列(2) Timer的使用

 

現(xiàn)在是4點,距離下班還有一個小時時間,準備再復(fù)習(xí)一下SDK

由于MFC使用了很長時間,總是有想返回去好好研究一下SDK的沖動。無奈時間有限,只能復(fù)習(xí)個一鱗半爪。

 

通過本文能夠了解到:

Timer的使用

 

第一部分:工程做成

    VC 6.0下面新建--Win32 Application ,在項目名處填寫testTimer,點擊OK,在下一頁選擇中間的選項,點擊完成。一個空空如也的項目建立完畢。

int APIENTRY WinMain(HINSTANCE hInstance,

                     HINSTANCE hPrevInstance,

                     LPSTR     lpCmdLine,

                     int       nCmdShow )

{

              return 0;

}

 

第二部分:添加骨肉

    可以將SDK骨架簡單記憶成:InitAppInitInstance,Message循環(huán),再加上一個WinProc四部分就可以了。雛形就不多說了。內(nèi)容如下:

    testTimer.cpp

 

#include "myresource.h"

 

BOOL InitApp(HINSTANCE hInst, LPCSTR szClassName);

BOOL InitInstance(HINSTANCE hInst, LPCSTR szClassName, 
int nCmdShow);

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);

 

int APIENTRY WinMain(HINSTANCE hInstance,

                     HINSTANCE hPrevInstance,

                     LPSTR     lpCmdLine,

                     
int       nCmdShow )

{

             MSG msg;

    
char szClassName[] = "timer";

    

    
if (!hPrevInstance) 

              {

        
if (!InitApp(hInstance, szClassName))

            
return FALSE;

    }

    
if (!InitInstance(hInstance, szClassName, nCmdShow)) 

              {

        
return FALSE;

    }

    
while (GetMessage(&msg, NULL, 00)) 

              {

        TranslateMessage(
&msg);

        DispatchMessage(
&msg);

    }

   
return msg.wParam;

}

 

// Windows register == MFC's PreCreateWindow

BOOL InitApp(HINSTANCE hInst, LPCSTR szClassName)

{

    WNDCLASS wc;

    wc.style 
= CS_HREDRAW | CS_VREDRAW;

    wc.lpfnWndProc 
= WndProc;    // Window Proc's Name 

    wc.cbClsExtra 
= 0;

    wc.cbWndExtra 
= 0;

    wc.hInstance 
= hInst;        // Instance

    wc.hIcon 
= LoadIcon(NULL, IDI_APPLICATION);

    wc.hCursor 
= LoadCursor(NULL, IDC_ARROW);

    wc.hbrBackground 
= (HBRUSH)GetStockObject(WHITE_BRUSH);

    wc.lpszMenuName 
= "TIMERMENU";    // Menu

    wc.lpszClassName 
= (LPCSTR)szClassName;

    
return (RegisterClass(&wc));

}

 

// Create Windows

BOOL InitInstance(HINSTANCE hInst, LPCSTR szClassName, 
int nCmdShow)

{

    HWND hWnd;

    hWnd 
= CreateWindow(szClassName,

            
"Timer",                                                  // Disp in Title bar

            WS_OVERLAPPEDWINDOW,    
// Window's kind

            CW_USEDEFAULT,                              
//

            CW_USEDEFAULT,                              
//

            CW_USEDEFAULT,                              
//Width

            CW_USEDEFAULT,                              
//Hight

            NULL,                                                                  
// Parent's handle

            NULL,                                                                  
// menu's handle

            hInst,                                                                   
// instanse 's handle

            NULL);

    
if (!hWnd)

        
return FALSE;

    ShowWindow(hWnd, nCmdShow);

    UpdateWindow(hWnd);

    
return TRUE;

}

 

//WndProc

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)

{

    
switch (msg) {

        
case WM_COMMAND:                   // Click Menu

            
switch (LOWORD(wp)) 

                                          {

                
case IDM_END:    // Menu's “Exit” Clicked

                    SendMessage(hWnd, WM_CLOSE, 
00L);

                    
break;

                
default:

                    
break;

            }

            
break;

        
case WM_DESTROY:

            PostQuitMessage(
0);

            
break;

        
default:                                            // calls the default window procedure

            
return (DefWindowProc(hWnd, msg, wp, lp));

    }

    
return 0L;

}

 

 

追加的File

myresource.h

#define IDM_END 1000

 

testTimer.rc

 

#include "myresource.h"

 

/////////////////////////////////////////////////////////////////////////////

//

// Menu

//

 

TIMERMENU MENU DISCARDABLE 

BEGIN

    MENUITEM 
"Exit",                        IDM_END

END

 

 

框架做好了。編譯一下,是不是可以生成一個最基本的程序框架了?

此框架啥都沒做,點擊一下Exit。程序退出。

 

第三部分:Timer的使用

好多人估計還不熟悉SDK框架,以后有時間我會補一個框架介紹,并暫定今天的標題為WindowsSDK入門系列,同時說明我的復(fù)習(xí)的內(nèi)容均Copy自網(wǎng)上,如有雷同,概不負責(zé)。

    我想使用的Timer很簡單,就是在程序界面上面,每一秒更新一次時間。就跟Windows右下角的那個鐘表一樣。

    先看一下SetTimer的原型

UINT_PTR SetTimer(          HWND hWnd, // 接受Timer消息的窗口句柄

    UINT_PTR nIDEvent,                               // timerID

    UINT uElapse,                                       // 經(jīng)過時間,毫秒為單位

    TIMERPROC lpTimerFunc // Timer的回調(diào)函數(shù)

);

這個設(shè)定一開始,Windows就會按時(根據(jù)uElapse)向程序發(fā)送WM_TIMER消息了。如果將回調(diào)函數(shù)設(shè)置為NULL,那么該消息能就在WndProc中獲得。

要想停止Timer,只需要調(diào)用函數(shù)

BOOL KillTimer(          HWND hWnd,

    UINT_PTR uIDEvent

);

傳入Window 句柄,跟TimerID即可關(guān)閉timer

 

主要函數(shù)說完了,先看代碼,然后再說說需要注意的細節(jié)。

 

#include "stdafx.h"

#include 
<time.h>

#include 
<stdio.h>

#include 
"myresource.h"

 

BOOL InitApp(HINSTANCE hInst, LPCSTR szClassName);

BOOL InitInstance(HINSTANCE hInst, LPCSTR szClassName, 
int nCmdShow);

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);

int GetTimeStr(void);

 

char time_str[256];

 

 

int APIENTRY WinMain(HINSTANCE hInstance,

                     HINSTANCE hPrevInstance,

                     LPSTR     lpCmdLine,

                     
int       nCmdShow )

{            MSG msg;

    
char szClassName[] = "timer";

    

    
if (!hPrevInstance) 

              {

        
if (!InitApp(hInstance, szClassName))

            
return FALSE;

   }

    
if (!InitInstance(hInstance, szClassName, nCmdShow)) 

              {

        
return FALSE;

    }

    
while (GetMessage(&msg, NULL, 00)) 

              {

        TranslateMessage(
&msg);

        DispatchMessage(
&msg);

    }

    
return msg.wParam;

}

 

// Windows register == MFC's PreCreateWindow

BOOL InitApp(HINSTANCE hInst, LPCSTR szClassName)

{

    WNDCLASS wc;

    wc.style 
= CS_HREDRAW | CS_VREDRAW;

    wc.lpfnWndProc 
= WndProc;    // Window Proc's Name 

    wc.cbClsExtra 
= 0;

    wc.cbWndExtra 
= 0;

    wc.hInstance 
= hInst;        // Instance

    wc.hIcon 
= LoadIcon(NULL, IDI_APPLICATION);

    wc.hCursor 
= LoadCursor(NULL, IDC_ARROW);

    wc.hbrBackground 
= (HBRUSH)GetStockObject(WHITE_BRUSH);

    wc.lpszMenuName 
= "TIMERMENU";    // Menu

    wc.lpszClassName 
= (LPCSTR)szClassName;

    
return (RegisterClass(&wc));

}

 

// Create Windows

BOOL InitInstance(HINSTANCE hInst, LPCSTR szClassName, 
int nCmdShow)

{

    HWND hWnd;

    hWnd 
= CreateWindow(szClassName,

            
"Timer",                                                  // Disp in Title bar

            WS_OVERLAPPEDWINDOW,    
// Window's kind

            CW_USEDEFAULT,                              
//

            CW_USEDEFAULT,                              
//

            
320,                                                                      //Width

            
100,                                                                                    //Hight

            NULL,                                                                  
// Parent's handle

            NULL,                                                                  
// menu's handle

            hInst,                                                                   
// instanse 's handle

            NULL);

    
if (!hWnd)

        
return FALSE;

    ShowWindow(hWnd, nCmdShow);

    UpdateWindow(hWnd);

    
return TRUE;

}

 

//WndProc

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)

{

              PAINTSTRUCT ps;

    HDC hdc;

    
int id;

 

    
switch (msg)              {

                            
case WM_CREATE:

            
if(SetTimer(hWnd, ID_MYTIMER, 1000, NULL) == 0

                                          {

                    MessageBox(hWnd,(LPCSTR)
"Fail",(LPCSTR)"Fail", MB_OK | MB_ICONEXCLAMATION);

            }

            
break;

        
case WM_TIMER:

            GetTimeStr();

            InvalidateRect(hWnd, NULL, TRUE);

            
break;

        
case WM_PAINT:

           hdc 
= BeginPaint(hWnd, &ps);

            TextOut(hdc, 
5015, (LPCSTR)time_str, strlen(time_str));

            EndPaint(hWnd, 
&ps);

            
break;

        
case WM_COMMAND:                   // Click Menu

            
switch (LOWORD(wp)) 

                                          {

                
case IDM_END:    // Menu's 乬Exit乭 Clicked

                    SendMessage(hWnd, WM_CLOSE, 
00L);

                    
break;

                
default:

                    
break;

            }

            
break;

                            
case WM_CLOSE:

            id 
= MessageBox(hWnd,

                (LPCSTR)
"Really Quit?",

                (LPCSTR)
"Quit",

                MB_YESNO 
| MB_ICONQUESTION);

            
if (id == IDYES) {

                                                        

                
if(KillTimer(hWnd, ID_MYTIMER) == TRUE) {

                                                                      
/*

                    MessageBox(hWnd,

                        (LPCSTR)"timer was killed",

                        (LPCSTR)"kill timer success",

                        MB_OK | MB_ICONEXCLAMATION);
*/

                }

                DestroyWindow(hWnd);

            }

            
break;

        
case WM_DESTROY:

            PostQuitMessage(
0);

            
break;

        
default:                                            // calls the default window procedure

            
return (DefWindowProc(hWnd, msg, wp, lp));

    }

    
return 0L;

}

 

int GetTimeStr(void)

{

    
char *str_org = "%2d年%d月%2d日 %2d時%2d分%2d秒";

  

              SYSTEMTIME stSystemTime;

              ::GetLocalTime(
&stSystemTime);

              sprintf(time_str, str_org,

        stSystemTime.wYear,stSystemTime.wMonth , stSystemTime.wDay, 

        stSystemTime.wHour,stSystemTime.wMinute, stSystemTime.wSecond

        );

 

    
return 0;

}

 

 

咳咳,現(xiàn)在說一下“要點”,其實也算不上什么要點。就是一些細節(jié)而已。把細節(jié)掌握多了,對程序也就會更加了解。

 

1.      我們將SetTimer放在WM_CREATE消息中執(zhí)行,這個消息是在CreateWindow執(zhí)行,創(chuàng)建了hWnd句柄后,我們才能將hWnd傳入SetTimer的以一個參數(shù)不是。

 

2.      KillTimer可以放到WM_DESTROY中執(zhí)行,如果你想要在停止前還做到什么其他動作。比如我想在停止前彈一個消息框,就可以在WM_CLOSE中添加,注意因為你可以調(diào)用Hook這個消息,但是一定要將他要做的事情也順帶做好了。WM_CLOSE自己要做什么?DestroyWindow(hWnd)DestroyWindow將會發(fā)送WM_DESTROY消息。

 

 

3.      Menu消息是通過WM_COMMAND來獲得的。

 

4.      WM_PAINT在這個消息中一般用BeginPaintEndPaint搭對使用,來獲得和銷毀句柄。

如果在其他地方,使用GetDC(),ReleaseDC MFC中,直接用那個dc(this)就可以了。

 

5.      GetTimeStr使用GetLocalTime來獲取系統(tǒng)當前時間。

 

6.      關(guān)于屏幕刷新InvalidateRect  BOOL InvalidateRect(

HWND hWnd,

 const RECT* lpRect,

 BOOL bErase

hWnd為要刷新句柄,lpRect為刷新區(qū)域,指定NULL為刷新整個區(qū)域。bEraseFASLE是不刷新背景。

 

End

posted on 2009-08-07 14:46 岳陽 閱讀(2055) 評論(1)  編輯 收藏 引用 所屬分類: 『 Windows SDK 』

評論

# re: WindowsSDK入門系列(2) Timer的使用 2009-08-07 16:45 根本不是SDK嘛

根本不是SDK嘛  回復(fù)  更多評論   


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美成人激情视频| 亚洲高清在线精品| 日韩一级片网址| 欧美日韩国产经典色站一区二区三区| 亚洲国产精品精华液网站| 亚洲国产高清自拍| 欧美日韩美女在线观看| 性欧美18~19sex高清播放| 欧美专区日韩专区| 亚洲韩国青草视频| 亚洲美女视频在线观看| 国产精品日韩精品| 久久在线免费视频| 欧美人妖另类| 久久精品国产成人| 蜜桃久久精品乱码一区二区| 亚洲图片欧美午夜| 久久久国产精品一区二区中文 | 亚洲一区www| 国产一区二区三区自拍| 亚洲第一福利社区| 国产精品美女午夜av| 乱码第一页成人| 欧美日韩久久久久久| 久久婷婷蜜乳一本欲蜜臀| 欧美激情在线免费观看| 久久精品夜色噜噜亚洲a∨| 欧美高清免费| 久久久久久91香蕉国产| 欧美日韩一卡二卡| 欧美成在线观看| 欧美成人一区二区在线| 国产精品一页| 亚洲清纯自拍| 一区二区三区在线看| 亚洲一区在线免费| 99人久久精品视频最新地址| 久久久www| 欧美一区二区三区免费观看视频| 欧美sm视频| 久久久噜噜噜久噜久久| 欧美视频一二三区| 亚洲日本一区二区| 亚洲高清资源综合久久精品| 亚洲欧洲av一区二区| 中文一区二区在线观看| 欧美国产日韩一区二区| 欧美福利一区二区三区| 一区二区在线看| 久久国产主播精品| 久久精品国产精品亚洲精品| 国产精品女主播在线观看| 99视频精品全部免费在线| 亚洲人成绝费网站色www| 久久综合九色综合久99| 久久五月激情| 黑人巨大精品欧美黑白配亚洲| 亚洲欧美国产高清| 午夜精品福利在线| 国产精品一区二区久激情瑜伽| 一区二区三区精品| 亚洲女性喷水在线观看一区| 一区二区免费看| 欧美大片va欧美在线播放| 99re亚洲国产精品| 免费欧美日韩| 亚洲丶国产丶欧美一区二区三区| 亚洲国产高清aⅴ视频| 免费观看亚洲视频大全| 免费日韩一区二区| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲精品日韩在线观看| 日韩一区二区高清| 欧美日韩国产在线| 亚洲一区二区三区免费视频 | 亚洲图中文字幕| 国产精品欧美激情| 午夜亚洲精品| 免费成人性网站| 亚洲人成啪啪网站| 欧美日韩一级大片网址| 午夜免费在线观看精品视频| 麻豆av一区二区三区| 亚洲欧洲免费视频| 欧美视频一区二区三区| 欧美一级大片在线免费观看| 女女同性女同一区二区三区91| 亚洲黄色av| 欧美午夜一区| 久久精品国产久精国产一老狼 | 亚洲国产精品综合| 亚洲欧美日韩国产综合在线 | 久久久www免费人成黑人精品 | 在线一区二区日韩| 久久久久国产精品人| 亚洲精选视频免费看| 欧美性猛交视频| 久久久久久久久久久一区| 亚洲乱码国产乱码精品精可以看| 欧美主播一区二区三区美女 久久精品人 | 亚洲一区二区在线观看视频| 久久综合中文色婷婷| 一区二区三区久久网| 国产一区在线看| 欧美另类99xxxxx| 欧美在线免费播放| 亚洲激情偷拍| 久久久亚洲国产美女国产盗摄| 一区二区电影免费观看| 在线观看日韩www视频免费| 欧美婷婷久久| 你懂的亚洲视频| 欧美一区二区三区另类| 亚洲免费观看高清完整版在线观看熊 | 亚洲尤物影院| 亚洲精品一区二区三区蜜桃久 | 亚洲欧洲日产国产网站| 国产亚洲欧美日韩日本| 国产精品久久久久一区二区三区| 欧美成人精品1314www| 欧美在线综合视频| 亚洲专区一区| 中国女人久久久| 亚洲精品国产无天堂网2021| 欧美va日韩va| 久久这里只有精品视频首页| 欧美一二三区精品| 亚洲一区区二区| 一区二区三区久久精品| 9i看片成人免费高清| 亚洲黄色小视频| 亚洲韩国日本中文字幕| 在线观看91久久久久久| 红桃视频一区| 激情五月综合色婷婷一区二区| 国产亚洲va综合人人澡精品| 国产欧美日韩专区发布| 国产精品久久久久久久久久久久| 欧美日韩一区二区三区四区在线观看 | 亚洲精品免费看| 91久久精品日日躁夜夜躁欧美| 亚洲国产另类 国产精品国产免费| 在线观看日韩精品| 亚洲电影观看| 亚洲七七久久综合桃花剧情介绍| 亚洲国产精品久久人人爱蜜臀| 亚洲电影免费在线观看| 亚洲激情在线| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 欧美日韩一区二区在线播放| 欧美日韩成人| 国产精品嫩草影院av蜜臀| 国产色产综合产在线视频| 狠狠色综合网站久久久久久久| 亚洲第一在线视频| 亚洲毛片在线| 亚洲欧美在线网| 久久久久久久精| 欧美高清你懂得| 一本色道久久综合狠狠躁篇的优点| 一区二区三区精品久久久| 性8sex亚洲区入口| 美女国产一区| 欧美日韩午夜视频在线观看| 国产区在线观看成人精品| 一区二区在线视频观看| 亚洲国产影院| 亚洲免费视频成人| 久久亚洲精品视频| 亚洲国产日韩欧美在线动漫| 亚洲影视在线| 老巨人导航500精品| 国产精品xvideos88| 精久久久久久久久久久| 制服丝袜激情欧洲亚洲| 久久在线视频在线| 一区二区三区视频在线看| 久久久97精品| 国产精品国产亚洲精品看不卡15| 一区在线免费| 亚洲欧美制服中文字幕| 欧美激情亚洲一区| 午夜精品久久久久久久白皮肤 | 裸体丰满少妇做受久久99精品| 欧美三级精品| 亚洲国产精品第一区二区三区 | 亚洲欧洲综合| 欧美在线观看视频在线 | 久久久久久久999精品视频| 亚洲人成毛片在线播放女女| 久久成人18免费观看| 欧美性天天影院| 亚洲毛片在线| 欧美96在线丨欧| 欧美一级大片在线观看| 国产精品乱子乱xxxx| 亚洲视频在线观看| 亚洲欧洲三级| 欧美va天堂va视频va在线| 激情伊人五月天久久综合|