2016年6月3日 星期五

Published 下午3:47 by with 0 comment

[基礎] Windows程式與開源軟體

本次的實驗是寫個windows的GUI程式。
傳統上認為windows視窗程式只能由Visual C來寫,但其實自由軟體也是能做的。

一樣使用CodeBlocks,但必須增加 compiler 稱作 mingw 的,
這是個支援windows程式開發的compiler。

 不過現在的 CodeBlocks 在下載頁面 已經增加了包裹mingw的版本。

下載附有mingw的安裝後即可直接使用
另外,為了能夠輕鬆的做視窗環境設計,打字描述視窗大小之類的事情太累了,
我們使用Resource Edit 資源編輯器,在資源編輯器將視窗畫好之後,
會自動產生 rc 檔 和 resource.h 供呼叫使用。



本實驗室最開始安裝就是這個版本。
所以一樣先建立個空白專案,我們不選擇內建的 Win32 GUI Project 樣式,因為那是C++的。

建立新專案和之前msp430的模式一樣,但是compiler選擇 GNU GCC Compiler

然後建立個 main.c 檔。

這個 main.c 檔用是 dailog 視窗法,這樣曾能夠輕易地從資源編輯器做設計。
檔案內容為:
#include "resource.h"
#include <windows.h>


HINSTANCE hInst;
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPTSTR lpCmdLine,
                   int iCmdShow)
{
     MSG  msg;
     HWND hwnd;
     hInst = hInstance;

     hwnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), 0, WndProc) ;

     ShowWindow (hwnd, iCmdShow);
     //UpdateWindow(hwnd);

     while (GetMessage(&msg, NULL, 0, 0))
     {
         TranslateMessage(&msg);
         DispatchMessage(&msg);
     }
     return msg.wParam;
}

LRESULT CALLBACK WndProc (HWND hwnd,
                          UINT message,
                          WPARAM wParam,
                          LPARAM lParam)
{
     switch (message)
     {
     case WM_CLOSE:
         DestroyWindow(hwnd);
         return TRUE;
         break;
     case WM_DESTROY:
         PostQuitMessage(0);
         return TRUE;
     };

     return FALSE;
}
所有windows程式的幾乎都差不多是這個形式,
至於這個程式為什麼是長這個樣子,
可以去問問微軟或者是參考書本 Programming Windows第五版
或者看看 theForger's Win32 API Programming Tutorial
學習windows的程式方法。

就像做msp430的開發時一樣,專案設定裡,
CodeBlocks 的設定 Project >> Properties >> Build Targets 要修改點設定

Types 要改為 GUI application 

接者使用 ResEdit 編一個視窗
設定編好的資源叫做rc檔,並且儲存在你程式的目錄下。

隨便開個Dialog視窗

按下儲存後,資源編輯器會產生兩個檔案,resource.h 檔內容是

#ifndef IDC_STATIC
#define IDC_STATIC (-1)
#endif

#define IDD_DIALOG1                             100


和 Dialog.rc 檔,內容是

// Generated by ResEdit 1.6.6
// Copyright (C) 2006-2015
// http://www.resedit.net

#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include "resource.h"
//
// Dialog resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_DIALOG1 DIALOG 0, 0, 186, 95
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "Ms Shell Dlg"
{
    PUSHBUTTON      "Cancel", IDCANCEL, 129, 24, 50, 14, 0, WS_EX_LEFT
    DEFPUSHBUTTON   "OK", IDOK, 129, 7, 50, 14, 0, WS_EX_LEFT
}

其中  resource.h 內描述了這個dialog視窗的代號,寫著100。
而 Dialog.rc 內描述了視窗的大小、位置、使用字形,有什麼按紐之類的,
當然如果寫程式的人很厲害要人工撰寫這些內容也不是不行...

注意,要呼叫視窗成功,在main.c的程式中
hwnd = CreateDialog(hInstance, MAKEINTRESOURCE( IDD_DIALOG1 ), 0, WndProc) ;
紅字中的 IDD_DIALOG1 和 resource.h 檔內描述的必須一致。

將這兩個檔案加入專案中,按下Build就可以建立執行檔了。

執行後的結果:


由於在main.c中的CALLBACK WndProc 並沒有處理那兩個按鈕訊息,
所以按下也不會有任何反應的,有需要添加按鈕的功能則必須再寫上。

更詳細的windows程式寫作資訊請參考
書本 Programming Windows第五版
網站  theForger's Win32 API Programming Tutorial





      edit

0 意見:

張貼留言