簡單windows應用程式的實現

理解windows應用程式的組成結構,WinMain()和窗口函數

掌握windows應用程式的運行機制

工具/原料

visual studio開發平台

方法/步驟

1、新建—項目,選擇「Win32項目

選擇「Windows應用程式」和「空項目」

【添加C++源文件】

// Win32.cpp : 定義應用程式的入口點。//#include "stdafx.h"#include "Win32.h"#define MAX_LOADSTRING 100// 全局變量:HINSTANCE hInst;                                                    // 當前實例TCHAR szTitle[MAX_LOADSTRING];                        // 標題欄文本TCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口類名/* 此代碼模塊中包含的函數的【前向聲明】:    (Forward Declaration)是指聲明標識符(表示編程的實體,如數據類型、變量、函數)時還沒有給出完整的定義。typedef unsigned short      WORD;typedef WORD                ATOM;About對話框的對話框處理函數 處理About對話框的各種消息窗口函數說明*///函數聲明ATOM            MyRegisterClass(HINSTANCE hInstance);BOOL            InitInstance(HINSTANCE, int);LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);/**************************************************************************************************************///一、WinMain函數/*實際就是__stdcall#define APIENTRY    WINAPI#define WINAPI      __stdcall_tWinMainWinMain函數結構1)註冊窗口類,並註冊【消息處理函數WindowProc】2)創建並顯示窗口3)循環獲取消息*///1.函數說明int APIENTRY _tWinMain(HINSTANCE hInstance,                          HINSTANCE hPrevInstance,                          LPTSTR    lpCmdLine,                       int       nCmdShow){    /*    Nothing at all    #define UNREFERENCED_PARAMETER(P)          (P)*///2.初始化    //目前無用    UNREFERENCED_PARAMETER(hPrevInstance);    UNREFERENCED_PARAMETER(lpCmdLine);     // TODO: 在此放置代碼。    MSG msg;    HACCEL hAccelTable;    // 初始化【全局字符串】?????????????????    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);    LoadString(hInstance, IDC_WIN32, szWindowClass, MAX_LOADSTRING);    MyRegisterClass(hInstance);    // 執行【應用程式初始化】:    if (!InitInstance (hInstance, nCmdShow))    {        return FALSE;    }    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN32));    //3.【主消息】循環:    while (GetMessage(&msg, NULL, 0, 0))    //消息隊列獲取消息,放入MSG,GetMessage返回值為 0 ,結束循環        {        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))        {            TranslateMessage(&msg);                        //虛擬鍵轉換為字符信息            DispatchMessage(&msg);                        //參數&msg == lpMSG指向的消息傳送到指定的窗口函數        }    }    return (int) msg.wParam;}///*//  函數: MyRegisterClass()////  目的: 註冊窗口類。////  注釋:////    僅當希望//    此代碼與添加到 Windows 95 中的「RegisterClassEx」//    函數之前的 Win32 系統兼容時,才需要此函數及其用法。調用此函數十分重要,//    這樣應用程式就可以獲得關聯的//    「格式正確的」小圖標。*///2.(2)註冊窗口類ATOM MyRegisterClass(HINSTANCE hInstance){    WNDCLASSEX wcex;    wcex.cbSize = sizeof(WNDCLASSEX);    wcex.style            = CS_HREDRAW | CS_VREDRAW;    wcex.lpfnWndProc    = WndProc;    wcex.cbClsExtra        = 0;    wcex.cbWndExtra        = 0;    wcex.hInstance        = hInstance;    wcex.hIcon            = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32));    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);    wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);    wcex.lpszMenuName    = MAKEINTRESOURCE(IDC_WIN32);    wcex.lpszClassName    = szWindowClass;    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));    return RegisterClassEx(&wcex);}/*//   函數: InitInstance(HINSTANCE, int)////   目的: 保存實例句柄並創建主窗口////   注釋:////        在此函數中,我們在全局變量中保存實例句柄並//        創建和顯示主程序窗口。*///2.(3)保存實例句柄並創建主窗口BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){   HWND hWnd;   hInst = hInstance; // 將實例句柄存儲在全局變量中   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);   if (!hWnd)   {      return FALSE;   }   ShowWindow(hWnd, nCmdShow);   UpdateWindow(hWnd);   return TRUE;}/************************************************************************************************************///二、窗口函數/*//  函數: WndProc(HWND, UINT, WPARAM, LPARAM)2015/3/15 21:15:45////  目的: 【處理【主窗口】的消息】////  WM_COMMAND    - 處理應用程式菜單//  WM_PAINT    - 繪製主窗口//  WM_DESTROY    - 發送退出消息並返回//*///【處理【主窗口】的消息】LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){    int wmId, wmEvent;    PAINTSTRUCT ps;    HDC hdc;    switch (message)    {    /*處理各種消息*/        case WM_COMMAND:        wmId    = LOWORD(wParam);        wmEvent = HIWORD(wParam);        // 分析菜單選擇:        switch (wmId)        {        case IDM_ABOUT:            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);            break;        case IDM_EXIT:            DestroyWindow(hWnd);            break;        default:            return DefWindowProc(hWnd, message, wParam, lParam);        }        break;    case WM_PAINT:        hdc = BeginPaint(hWnd, &ps);        // TODO: 在此添加任意繪圖代碼...                EndPaint(hWnd, &ps);        break;    case WM_DESTROY:        PostQuitMessage(0);        break;    default:        return DefWindowProc(hWnd, message, wParam, lParam);    }    return 0;}// 【處理【關於】的消息】。INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){    UNREFERENCED_PARAMETER(lParam);    switch (message)    {        /*處理各種消息*/            case WM_INITDIALOG:            //WM_INITDIALOG 消息是對話框才能收到的消息,表明對話框及其所有子控制項都創建完畢了。        return (INT_PTR)TRUE;    case WM_COMMAND:             //窗口通過WindowProc函數收到此消息        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)        {            EndDialog(hDlg, LOWORD(wParam));            return (INT_PTR)TRUE;        }        break;    }    return (INT_PTR)FALSE;}

Windows程序窗口的創建過程和消息循環如何實現?

(1)得到應用程式的句柄(GetModuleHandle)。

(2)註冊窗口類(RegisterClassEx)。

在註冊前,填寫RegisterClassEx的參數WNDCLASSEX結構。

(3)建立窗口(CreateWindowEx)。

(4)顯示窗口(ShowWindows)。

(5)刷新窗口客戶區(UpdateWindow)。

(6)進入無限的消息獲取和處理的循環。

首先獲取消息(GetMessage):

如果有消息到達,則將消息分派到回調函數處理(DispatchMessage)

如果消息是WM_QUIT,則退出循環。

注意事項

注意:添加 #include

相關文章

  1. windows畫圖程序妙用 簡單暴力解決圖片處理問題

    圖片處理工具一般只有專業的用戶才會用的,普通人很少會下載專業的圖片處理工具.但是,如果遇到了需要處理圖片的情況,該怎麼辦呢?這時候可以用windows自帶的畫圖程序來進行處理,以解燃眉之急. 方法/步 ...
  2. 使用Python開發windows桌面程序【超簡單】

    使用Python開發windows桌面程序[超簡單] 方法/步驟 一.開發前期準備 1. boa-constructor-0.6.1.bin.setup.exe #一個wxWidges的集成開發環境, ...
  3. 如何禁止啟動項windows電腦程式?

    電腦開機有部分軟體直接啟動,如何在不用下載新應用的時候,禁止啟動項運行.適用windows 8和windows 10. 工具/原料 以關閉'騰訊QQ'為例 方法/步驟 點擊'開始' 進入搜尋. 提供各 ...
  4. 如何快速簡單的創建程序文件

    有很多人不知道如何創建程序文件,在這裡我詳細解說一下 工具/原料 電腦 相關程序 方法/步驟 如果沒有現成的程序,那麼就要新建一個程序文件.在kill中有一些程序的demo, 點擊新建文件快捷按鍵,在 ...
  5. windows安裝程序無法將windows

    U盤安裝ghost win7出現錯誤: 先是:windows安裝程序無法將windows配置為在此計算機的硬體上運行 然後:OEMSY  IS  MISSING 方法/步驟 解決"windo ...
  6. 如何寫一個簡單的c語言程序

    我們知道,對於一個剛剛接觸到c語言的人來說,寫一個hello的程序老說,就是很難,這裡小編根據自己的學習和一個操作經驗, 寫一篇關於寫一個簡單c語言程序的介紹.對於一些後學習的人,希望有所幫助. 1: ...
  7. Lost用PHP寫簡單博客程序:[2]配置文件篇

    當年學了PHP,一個半掉子水平,寫了個簡單的博客程序,只想把自己的經驗記錄. 工具/原料 文本編輯器 PHP基礎 方法/步驟 上一節寫了Lost類,我把它保存到include文件夾下的Lost.php ...
  8. 如何使用u深度u盤修復windows啟動程序

    電腦已經成為了家喻戶曉的電子科技產品,用了它我們可以更輕鬆,更快速的搞定以前我們所無法短時間內完成的事情.但電腦和我們人一樣,有時候也會有生病故障的事情.今天小編就來教大家使用u深度u盤中所準備的wi ...
  9. 怎樣釋放windows應用程式關閉時DLL文件的內存

    當我們在運行windows應用程式時,已將應用程式關閉後還可能存在一些DLL文件未釋放內存,會照成系統運行速度慢,現在來看一下怎麼清除內存中的dll資料. 步驟/方法 打開註冊表,點"開始& ...
  10. windows系統程序經常假死卡住怎麼辦

    win7用戶在使用系統的時候,常常會遇到系統提示"程序未響應"問題,於是系統就進入了假死狀態,動彈不了,這該怎麼辦呢?下面我們就通過圖文解說,看看這個問題是如何被破解的. 方法/步 ...
  11. 如何管理 Windows 8啟動程序

    有一些程序在安裝過程中自動加入到了系統啟動中,從而導致系統啟動緩慢.根據自己的實際需要,可以把一些不影響我們正常使用的開機啟動程序關掉,從而加快系統自身的啟動速度,減少對系統資源的占用,從而可以達到一 ...
  12. 如何用java編寫一個簡單的小程序

    這篇文章針對於java小白 工具/原料 一台安裝好了java開發環境的電腦(JDK,eclipse) 方法/步驟 首先打開eclipse應用程式,選擇好工作路徑!打開後如圖. 我們先新建一個項目,點擊 ...
  13. 如何編寫簡單的shell程序

    shell是將linux或類Unix系統中的一部分命令組合在一起完成某項工作的腳本. 工具/原料 Linux Shell 方法/步驟 使用vim.nano.vi等任意文本編輯工具,都可以編寫shell ...
  14. 禁止啟動windows應用程式

    利用組策略禁止啟動windows應用程式 方法/步驟 win+r gpedit.msc 用戶配置>管理模塊>點擊系統>不要運行Windows應用程式 ctrl+alt+del找到應用 ...
  15. 教授你簡單設置Win7程序窗口提高工作效率

    Windows 7系統的無論就操作體驗還是對於一些細節方面的改進,相對於Windows XP系統都是很明顯,比如一個小小的程序窗口,也是做足了文章.尤其是對於經常打開多個程序窗口進行工作的時候,我們只 ...
  16. 怎樣編輯一個簡單的C語言程序

    平時,我們看到那些高大上的程式設計師們,感覺他們編寫的程序是多麼的神秘與深奧,常常希望自己也能有那樣的本事,但是,自己又是一個電腦小白,不由望而興嘆,今天,我就教大家編寫一個簡單的C語言程序.(如果這篇經 ...
  17. Windows 7應用程式控制策略:深度安全防禦

    Windows 7 對於用戶運行程序有什麼好的訪問控制方法?相對於 Windows XP 有什麼改進?我們如何利用它來完善縱深安全防禦機制的一個重要環節?我們將在這篇 blog 中找到答案. 應用程式 ...
  18. Android製作簡單撥打電話程序步驟

    眾所周知,對於一個手機,能撥打電話是其最重要也是最常用的一個功能.而在Android里是怎麼樣實現撥打電話的程序呢?我在這裡寫了一個簡單的撥打電話的Demo,供大家參考 方法/步驟 新建一個Andro ...
  19. eclipse(英文版)入門:[3]編寫簡單的GUI程序

    Java和GUI(圖形化用戶界面)功能強大,使用它可以編寫出我們常用的窗口程序,不再是黑框白字了!!! 工具/原料 eclipse程序 方法/步驟 打開eclipse,點擊"file-> ...
  20. 【Java教程】用Eclipse開發一個簡單的Java程序

    Java是一種可以撰寫跨平台應用軟體的面向對象的程序設計語言.Java 技術具有卓越的通用性.高效性.平台移植性和安全性,廣泛應用於PC.數據中心.遊戲控制台.科學超級計算機.行動電話和網際網路,同時擁 ...