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

Windows程序內(nèi)部運(yùn)行機(jī)制

1,windows程序設(shè)計(jì)是種事件驅(qū)動(dòng)方式的程序設(shè)計(jì),主要基于消息的。當(dāng)用戶需要完成某種功能時(shí),需要調(diào)用OS某種支持,然后OS將用戶的需要包裝成消息,并投入到消息隊(duì)列中,最后應(yīng)用程序從消息隊(duì)列中取走消息并進(jìn)行響應(yīng)。
2,消息結(jié)構(gòu):
typedef struct tagMSG {     // msg
    HWND   hwnd;     //接收消息的窗口句柄。和哪個(gè)窗口相關(guān)聯(lián)。
    UINT   message;  //消息標(biāo)識(shí)。消息本身是什么。
    WPARAM wParam;   //消息的附加信息。具體取決于消息本身。  
    LPARAM lParam;
    DWORD  time;     //消息投遞時(shí)間。 
    POINT  pt;       //消息投遞時(shí),光標(biāo)在屏幕上的位置。 
} MSG;

3,消息隊(duì)列:
每個(gè)應(yīng)用程序OS都為它建立一個(gè)消息隊(duì)列,消息隊(duì)列是個(gè)先進(jìn)先出的緩沖區(qū),其中每個(gè)元素都是一個(gè)消息,OS將生成的每個(gè)消息按先后順序放進(jìn)消息隊(duì)列中,應(yīng)用程序總是取走當(dāng)前消息隊(duì)列中的第一條消息,應(yīng)用程序取走消息后便知道用戶的操作和程序的狀態(tài),然后對(duì)其處理即消息響應(yīng),消息響應(yīng)通過編碼實(shí)現(xiàn)。

4,使用VC編程除了良好的C基礎(chǔ)外還需要掌握兩方面:
一,消息本身。不同消息所代表的用戶操作和應(yīng)用程序的狀態(tài)。
二,對(duì)于某個(gè)特定的消息來說,要讓OS執(zhí)行某個(gè)特定的功能去響應(yīng)消息。

5,Window程序入口:
int WINAPI WinMain(
  HINSTANCE hInstance,  // 當(dāng)前事例句柄。
  HINSTANCE hPrevInstance,  // 先前事例句柄。
  LPSTR lpCmdLine,      // 命令行指針
  int nCmdShow          // (窗口)顯示的狀態(tài)
);
說明:WinMain函數(shù)是Windows程序入口點(diǎn)函數(shù),由OS調(diào)用,當(dāng)OS啟動(dòng)應(yīng)用程序的時(shí)候,winmain函數(shù)的參數(shù)由OS傳遞的。

6,創(chuàng)建一個(gè)完整的窗口需要經(jīng)過下面四個(gè)操作步驟:
一,設(shè)計(jì)一個(gè)窗口類;如:WNDCLASS wndcls;
二,注冊(cè)窗口類;    如:RegisterClass(&wndcls);
三,創(chuàng)建窗口;      如:CreateWindow(),CreateWindowEX();
四,顯示及更新窗口。如:ShowWindow(),UpdateWindow();

說明:創(chuàng)建窗口的時(shí)候一定要基于已經(jīng)注冊(cè)的窗口類.

7,Windows提供的窗口類:
typedef struct _WNDCLASS {
    UINT    style;        //窗口的類型
    WNDPROC lpfnWndProc;  //窗口過程函數(shù)指針(回調(diào)函數(shù))
    int     cbClsExtra; //窗口類附加字節(jié),為該類窗口所共享。通常0。
    int     cbWndExtra; //窗口附加字節(jié)。通常設(shè)為0。
    HANDLE  hInstance;  //當(dāng)前應(yīng)用程序事例句柄。
    HICON   hIcon;      //圖標(biāo)句柄 LoadIcon();
    HCURSOR hCursor;    //光標(biāo)句柄 LoadCursor();
    HBRUSH  hbrBackground; //畫刷句柄 (HBRUSH)GetStockObject();
    LPCTSTR lpszMenuName;  //菜單名字
    LPCTSTR lpszClassName; //類的名字
} WNDCLASS;

8,窗口類注冊(cè):
ATOM RegisterClass(
  CONST WNDCLASS *lpWndClass   // address of structure with class
                               // data
);

9,創(chuàng)建窗口:
HWND CreateWindow(
  LPCTSTR lpClassName,  // pointer to registered class name
  LPCTSTR lpWindowName, // pointer to window name
  DWORD dwStyle,        // window style
  int x,                // horizontal position of window
  int y,                // vertical position of window
  int nWidth,           // window width
  int nHeight,          // window height
  HWND hWndParent,      // handle to parent or owner window
  HMENU hMenu,          // handle to menu or child-window identifier
  HANDLE hInstance,     // handle to application instance
  LPVOID lpParam        // pointer to window-creation data
);

10,顯示和更新窗口窗口:
BOOL ShowWindow(
  HWND hWnd,     // handle to window
  int nCmdShow   // show state of window
);
BOOL UpdateWindow(
  HWND hWnd   // handle of window
);

11,消息循環(huán):
MSG msg;
while(GetMessage(&msg,...))    //從消息隊(duì)列中取出一條消息
{
 TranslateMessage(&msg); //進(jìn)行消息(如鍵盤消息)轉(zhuǎn)換
 DispatchMessage(&msg); //分派消息到窗口的回調(diào)函數(shù)處理,(OS調(diào)用窗口回調(diào)函數(shù)進(jìn)行處理)。
}

其中:
//**The GetMessage function retrieves a message from the calling thread's message queue and places it in the specified structure.
//**If the function retrieves a message other than WM_QUIT, the return value is nonzero.If the function retrieves the WM_QUIT message, the return value is zero. If there is an error, the return value is -1.

BOOL GetMessage(
  LPMSG lpMsg,         // address of structure with message
  HWND hWnd,           // handle of window
  UINT wMsgFilterMin,  // first message
  UINT wMsgFilterMax   // last message
);


//The TranslateMessage function translates virtual-key messages into character messages. The character messages are posted to the calling thread's message queue, to be read the next time the thread calls the GetMessage or PeekMessage function.
BOOL TranslateMessage(
  CONST MSG *lpMsg   // address of structure with message
);

//The DispatchMessage function dispatches a message to a window procedure.
LONG DispatchMessage(
  CONST MSG *lpmsg   // pointer to structure with message
);


12,窗口過程函數(shù)(回調(diào)函數(shù))原型:
The WindowProc function is an application-defined function that processes messages sent to a window. The WNDPROC type defines a pointer to this callback function. WindowProc is a placeholder(占位符) for the application-defined function name.

LRESULT CALLBACK WindowProc(  //這里WindowProc是個(gè)代號(hào)名字。
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);

說明:兩種函數(shù)調(diào)用約定(__stdcall 和 __cdecl):
#define CALLBACK    __stdcall
//__stdcall 標(biāo)準(zhǔn)調(diào)用預(yù)定,是PASCAL 調(diào)用約定,象DELPHI使用的就是標(biāo)準(zhǔn)調(diào)用約定
#define WINAPIV     __cdecl 
// __cdecl 是C 語言形式的調(diào)用約定。


主要區(qū)別:函數(shù)參數(shù)傳遞順序 和 對(duì)堆棧的清除上。
問題:除了那些可變參數(shù)的函數(shù)調(diào)用外,其余的一般都是__stdcall約定。但 C/C++編譯默然的是__cdecl約定。所以如果在VC等環(huán)境中調(diào)用__stdcall約定的函數(shù),必須要在函數(shù)聲明的時(shí)加上 __stdcall 修飾符,以便對(duì)這個(gè)函數(shù)的調(diào)用是使用__stdcall約定(如使用DELPHI編寫的DLL時(shí)候)。
(VC中可通過這途徑修改:project|settings..|c/c++|...)


在窗口過程函數(shù)中通過一組switch語句來對(duì)消息進(jìn)行處理:
如:
LRESULT CALLBACK WindowProc( 
  HWND hwnd,
  UINT uMsg,
  WPARAM wParam,
  LPARAM lParam  
)
{
    switch(uMsg)
    {
 case WM_PAINT:
  ...
  break;
 case ...
  break;
 case WM_CLOSE:
  //DestroyWindow(hwnd);
   //銷毀窗口,并發(fā)送WM_DESTROY消息。
  break;
 case WM_DESTROY:
  //PostQuitMessage(0);
  //發(fā)送WM_QUIT消息到消息隊(duì)列中,請(qǐng)求終止。
         //GetMessage()取到WM_QUIT消息后,返回0,退出消息循                //   環(huán),從而終止應(yīng)用程序。
  break;
 default:
  return DefWindowProc(hwnd,uMsg,wParam,lParam);
 //用缺省的窗口過程處理我們不感興趣的消息(其它消息)。
 //這是必須的。
    }//switch
 return 0;
}//WindowProc

13,DestroyWindow()函數(shù)和PostQuitMessage()函數(shù)原型:
//**The DestroyWindow function destroys the specified window. The function sends WM_DESTROY and WM_NCDESTROY messages。

BOOL DestroyWindow(
  HWND hWnd   // handle to window to destroy
);

//**The PostQuitMessage function indicates to the system that a thread has made a request to terminate (quit). It is typically used in response to a WM_DESTROY message.
//**The PostQuitMessage function posts a WM_QUIT message to the thread's message queue and returns immediately; the function simply indicates(預(yù)示,通知) to the system that the thread is requesting to quit at some time in the future.

When the thread retrieves the WM_QUIT message from its message queue, it should exit its message loop and return control to the system.

VOID PostQuitMessage(
  int nExitCode   // exit code
);

14,關(guān)于DC句柄獲?。?br>a)使用BeginPaint(),EndPaint()對(duì)。注意只能在響應(yīng)WM_PAINT消息時(shí)使用。
b)使用GetDc(),ReleaseDC()對(duì)。注意他們不能在響應(yīng)WM_PAINT中使用。

posted on 2008-03-11 15:02 弱水一瓢 閱讀(174) 評(píng)論(0)  編輯 收藏 引用 所屬分類: MFC

<2025年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

導(dǎo)航

統(tǒng)計(jì)

文章分類

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲视频福利| 国产欧美日韩综合一区在线播放| 在线播放一区| 欧美黑人国产人伦爽爽爽| 久久婷婷蜜乳一本欲蜜臀| 亚洲电影免费观看高清完整版| 欧美r片在线| 欧美精品一区在线观看| 一本色道久久综合一区| 亚洲麻豆av| 国产精品视频一二三| 久久天天狠狠| 欧美国产精品人人做人人爱| 亚洲一区二区三区四区视频 | 亚洲激情欧美| 亚洲第一黄色网| 欧美国产日本| 欧美在线不卡视频| 久久一区二区精品| 亚洲图片欧美午夜| 欧美制服丝袜第一页| 亚洲七七久久综合桃花剧情介绍| 亚洲精品一区二区网址| 国产精品黄色| 久久在线免费观看| 欧美日韩在线第一页| 久久久人人人| 欧美片在线播放| 久久手机免费观看| 欧美日韩激情小视频| 久久天天综合| 国产精品成人国产乱一区| 老色鬼精品视频在线观看播放| 欧美精品一区二区精品网 | 亚洲激情av在线| 亚洲欧美激情精品一区二区| 亚洲激情网站| 欧美一区二区日韩| 亚洲伊人伊色伊影伊综合网| 免费观看欧美在线视频的网站| 亚洲一区激情| 欧美区二区三区| 裸体女人亚洲精品一区| 国产精品扒开腿爽爽爽视频| 欧美成人精品高清在线播放| 国产精品综合视频| 亚洲免费大片| 免费日韩av| 久久久午夜电影| 国产精品私拍pans大尺度在线| 亚洲福利小视频| 国产中文一区二区| 午夜亚洲性色福利视频| av不卡免费看| 欧美电影免费| 欧美激情一二三区| 亚洲国产高清高潮精品美女| 午夜电影亚洲| 午夜久久黄色| 国产精品亚洲视频| 一区二区三区四区国产| 夜夜爽www精品| 欧美日韩高清在线播放| 亚洲福利在线看| 亚洲毛片在线观看.| 你懂的成人av| 亚洲高清视频的网址| 亚洲国产小视频在线观看| 久久天天躁夜夜躁狠狠躁2022 | 一本一本a久久| 欧美激情片在线观看| 亚洲韩国青草视频| 99精品欧美| 欧美日韩精品免费| 99精品国产热久久91蜜凸| 国产精品99久久99久久久二8| 欧美激情精品久久久久久免费印度| 欧美黄色小视频| 日韩午夜中文字幕| 欧美日韩国产一区二区三区地区| 亚洲日本理论电影| 亚洲综合色激情五月| 国产精品午夜春色av| 欧美一区亚洲| 亚洲成人在线视频播放| 欧美日韩国产黄| 亚洲视频成人| 久久久久一区二区三区四区| 在线播放亚洲| 欧美日韩在线电影| 欧美一级片一区| 欧美电影在线观看| 一区二区三区国产在线观看| 国产精品久久久一区二区| 久久er99精品| 亚洲激情影视| 欧美一区二区三区男人的天堂| 国产一区二区三区四区五区美女| 毛片av中文字幕一区二区| 亚洲美女诱惑| 久久久久9999亚洲精品| 亚洲高清精品中出| 国产精品视频yy9099| 久久在线视频| 亚洲视频在线视频| 免费美女久久99| 午夜精品国产更新| 亚洲电影在线免费观看| 国产精品嫩草影院一区二区| 久久字幕精品一区| 亚洲尤物在线| 91久久亚洲| 久久视频一区| 午夜激情一区| 一本高清dvd不卡在线观看| 国产一区在线视频| 欧美午夜精品理论片a级大开眼界| 欧美主播一区二区三区美女 久久精品人 | 亚洲自拍都市欧美小说| 久久亚洲春色中文字幕| 亚洲视频在线观看网站| 亚洲风情在线资源站| 国产精品一区二区久激情瑜伽| 欧美与黑人午夜性猛交久久久| 亚洲精品免费在线| 美女精品在线| 久久久亚洲人| 亚洲一区二区三区四区视频| 亚洲黄一区二区| 精品91久久久久| 国产日产高清欧美一区二区三区| 欧美日韩亚洲成人| 欧美国内亚洲| 欧美成人性网| 另类国产ts人妖高潮视频| 久久激情网站| 欧美一区二区三区视频| 亚洲一区二区三区涩| 亚洲视频一区二区在线观看 | 亚洲欧美视频在线观看| av成人免费在线| 99av国产精品欲麻豆| 91久久中文| 日韩视频免费大全中文字幕| 亚洲电影免费观看高清完整版在线观看 | 久久免费高清视频| 久久国产精品99久久久久久老狼| 亚洲图片在区色| 亚洲少妇自拍| 亚洲视频电影在线| 午夜精品99久久免费| 性欧美激情精品| 久久久久国产精品www | 欧美v国产在线一区二区三区| 久久在线91| 毛片精品免费在线观看| 男女激情久久| 国产精品日韩欧美一区二区三区| 欧美日韩dvd在线观看| 欧美日韩影院| 国产精品视频一区二区三区| 国产日韩精品入口| 黄色成人精品网站| 亚洲七七久久综合桃花剧情介绍| 亚洲美女毛片| 亚洲欧美日韩爽爽影院| 久久久亚洲精品一区二区三区| 久久免费视频一区| 亚洲国产精品尤物yw在线观看| 亚洲日本理论电影| 亚洲欧美日韩国产另类专区| 欧美在线看片a免费观看| 美日韩免费视频| 欧美日韩中文另类| 韩国一区电影| 99热精品在线| 久久久久成人精品| 亚洲人屁股眼子交8| 亚洲欧美久久久| 欧美成在线观看| 国产欧美一区二区三区国产幕精品 | 久久久之久亚州精品露出| 免费久久精品视频| 99re6这里只有精品| 欧美一区二区精品| 欧美久久视频| 国内久久精品| 亚洲影视在线| 欧美黄色片免费观看| 午夜精彩国产免费不卡不顿大片| 久久久高清一区二区三区| 欧美偷拍另类| 亚洲国产电影| 久久成人国产精品| 亚洲精品视频啊美女在线直播| 欧美一区二区视频免费观看| 欧美日韩精品免费在线观看视频| 激情久久婷婷| 久久成人免费网| 亚洲一区二区三区色|