【Windows編程】系列第八篇:通用對話方塊

來源:互聯網
上載者:User

標籤:

上一篇我們學習了菜單的基本編程,本篇來瞭解一下通用對話方塊的使用。Windows系統之所以是目前最流行的案頭系統,也是因為Windows有一套標準化,統一友好的互動介面,比如菜單、工具列、狀態列以及各個控制項。當然除了這些單獨的控制項之外,對於像檔案開啟、儲存對話方塊,字型對話,顏色對話方塊等對於Windows本身會用到,在很多第三方的應用程式中也會用到。因此微軟公司也早就清楚這種現實情況會存在,所以Windows把這種常見的大眾交談就做了統一的介面函數,供Windows自己和第三方開發人員使用。

Windows提供的公用對話方塊在不同的版本有所不一樣,但常見的公用對話方塊有:顏色選擇對話方塊、開啟檔案對話方塊、儲存檔案對話方塊、字型選擇對話方塊、尋找對話方塊、替換對話方塊、列印對話方塊以及列印設定對話方塊等。

本篇以最常見的檔案開啟/儲存對話方塊、字型對話方塊、顏色對話方塊為例,來學習如何建立這些對話方塊,其他的對話方塊使用大同小異,且在MSDN上基本都有使用執行個體。

要使用公用對話方塊函數,需要包含commdlg.h標頭檔,相關的資料結構和函數定義都在該標頭檔中定義。

  • 檔案開啟對話方塊

檔案開啟對話方塊主要用於選擇需要的檔案,把選擇的檔案全路徑名傳給使用者,至於取到檔案全路徑之後怎麼操作完全是開發人員自己決定。也就是說它提供了一個在電腦中選擇任何檔案的公用操作介面。API函數定義如下:

BOOL GetOpenFileName(LPOPENFILENAME lpofn);

參數lpofn的定義如下:

typedef struct tagOFN {   DWORD         lStructSize;   HWND          hwndOwner;   HINSTANCE     hInstance;   LPCTSTR       lpstrFilter;   LPTSTR        lpstrCustomFilter;   DWORD         nMaxCustFilter;   DWORD         nFilterIndex;   LPTSTR        lpstrFile;   DWORD         nMaxFile;   LPTSTR        lpstrFileTitle;   DWORD         nMaxFileTitle;   LPCTSTR       lpstrInitialDir;   LPCTSTR       lpstrTitle;   DWORD         Flags;   WORD          nFileOffset;   WORD          nFileExtension;   LPCTSTR       lpstrDefExt;   LPARAM        lCustData;   LPOFNHOOKPROC lpfnHook;   LPCTSTR       lpTemplateName; #if (_WIN32_WINNT >= 0x0500)  void *        pvReserved;  DWORD         dwReserved;  DWORD         FlagsEx;#endif // (_WIN32_WINNT >= 0x0500)} OPENFILENAME, *LPOPENFILENAME;

 

該介面定義的各個參數成員請參考MSDN的詳細解釋,這裡我們最常用到的幾項如下:

lpstrFilter:該參數用於設定開啟或儲存對話的檔案格式過濾,比如中的檔案過濾情景,相信所有的讀者朋友都見過:

lpstrFile:該參數用於儲存選擇結束後的選擇檔案。

nMaxFile:該參數指出上面用於儲存結果檔案的buffer字元長度。

Flags:該參數最常見用於設定是否可以多選,其他請查看MSDN。

  • 檔案儲存對話方塊

檔案儲存對話方塊跟檔案開啟對話幾乎完全一樣,參數相同。功能也是為使用者儲存檔案時選擇或建立檔案名稱、儲存路徑進行選擇的公用操作介面。API函數定義如下:

BOOL GetSaveFileName(LPOPENFILENAME lpofn);

該函數的參數與上面完全一樣,只是有些不能在檔案儲存對話方塊函數中使用,儲存檔案時不能多選名字。

  • 顏色選擇對話方塊

該對話方塊函數提供統一介面用於選擇顏色,API函數定義如下:

BOOL ChooseColor(LPCHOOSECOLOR lpcc);

參數lpcc最重要的參數:

lpCustColors,它指向一個包含16個值的數組,該數組包含了對話方塊中自訂色彩的紅、綠、藍(RGB)值。如果使用者修改這些顏色,系統將用新的顏色值更新這個數組。如果要在多個ChooseColor函數中儲存這個新的數組,我們應該為該數組分配靜態記憶體空間。

rgbResult:該參數儲存了選擇的顏色值。

  • 字型選擇對話方塊:

該對話方塊函數用於瀏覽並選擇字型,包括顏色。API函數定義如下:

BOOL ChooseFont(LPCHOOSEFONT lpcf);

對話方塊函數運行結束後的字型在rgbColors參數中,我們可以用它來建立選擇的字型。

以上各個結構的其他成員請參考MSDN。

下面我們以一個demo程式示範以上幾種大眾交談框的基本用法。

#include <windows.h>#include <tchar.h>#pragma comment(linker,"\"/manifestdependency:type=‘win32‘ ""name=‘Microsoft.Windows.Common-Controls‘ ""version=‘6.0.0.0‘ processorArchitecture=‘*‘ ""publicKeyToken=‘6595b64144ccf1df‘ language=‘*‘\"")#define IDC_FILE_DIALOG  1001#define IDC_COLOR_DIALOG 1002#define IDC_FONT_DIALOG  1003static TCHAR szAppName[] = TEXT("CommonDialog");static LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){     HWND     hWnd;     MSG      msg;     WNDCLASS wndclass;     wndclass.style         = CS_HREDRAW | CS_VREDRAW;     wndclass.lpfnWndProc   = WndProc;     wndclass.cbClsExtra    = 0;     wndclass.cbWndExtra    = 0;     wndclass.hInstance     = hInstance;     wndclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);     wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);     wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);     wndclass.lpszMenuName  = NULL;     wndclass.lpszClassName = szAppName;     if (!RegisterClass(&wndclass))     {          MessageBox (NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);          return 0;     }          hWnd = CreateWindow(szAppName,             // window class name                          szAppName,            // window caption                          WS_OVERLAPPEDWINDOW,  // window style                          CW_USEDEFAULT,        // initial x position                          CW_USEDEFAULT,        // initial y position                          400,              // initial x size                          300,              // initial y size                          NULL,             // parent window handle                          NULL,             // window menu handle                          hInstance,        // program instance handle                          NULL);            // creation parameters          ShowWindow(hWnd, iCmdShow);     UpdateWindow(hWnd);          while (GetMessage(&msg, NULL, 0, 0))     {          TranslateMessage(&msg);          DispatchMessage(&msg);     }     return msg.wParam;}static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){HDC hDC;switch (message){case WM_CREATE:CreateWindow(TEXT("BUTTON"), TEXT("file dialog"), WS_CHILD|WS_VISIBLE, 20, 40, 160, 40, hWnd, (HMENU)IDC_FILE_DIALOG, NULL, NULL);CreateWindow(TEXT("BUTTON"), TEXT("color dialog"),WS_CHILD|WS_VISIBLE, 20, 100, 160, 40, hWnd, (HMENU)IDC_COLOR_DIALOG, NULL, NULL);CreateWindow(TEXT("BUTTON"), TEXT("font dialog"), WS_CHILD|WS_VISIBLE, 20, 160, 160, 40, hWnd, (HMENU)IDC_FONT_DIALOG, NULL, NULL);return 0;case WM_COMMAND:{int wmId = LOWORD(wParam);switch (wmId){case IDC_FILE_DIALOG:{OPENFILENAME ofn;TCHAR ext[] = TEXT(".dat");TCHAR szFile[MAX_PATH] = TEXT("default");TCHAR szFilter[] = TEXT("文字檔 (*.txt)\0*.txt\0")           TEXT("資料檔案 (*.dat)\0*.dat\0")   TEXT("All Files (*.*)\0*.*\0\0");ZeroMemory(&ofn, sizeof(ofn));ofn.lStructSize  = sizeof(ofn);ofn.hwndOwner = hWnd;ofn.lpstrFilter  = szFilter;ofn.nFilterIndex = 1;  // 1 to default show *.txt type file; 2 to default show *.dat type file.ofn.lpstrFile = szFile;ofn.nMaxFile = MAX_PATH;ofn.lpstrDefExt  = ext;ofn.Flags = OFN_PATHMUSTEXIST|OFN_OVERWRITEPROMPT;if (GetOpenFileName(&ofn))//GetOpenFileName, GetSaveFileName{                                                //將選擇的檔案輸出到視窗LPTSTR file = ofn.lpstrFile; //file就是儲存或者開啟的檔案名稱hDC = GetDC(hWnd);TextOut(hDC, 200, 50, ofn.lpstrFile, _tcslen(ofn.lpstrFile));ReleaseDC(hWnd, hDC);}}break;case IDC_COLOR_DIALOG:{CHOOSECOLOR cc;static COLORREF acrCustClr[16];ZeroMemory(&cc, sizeof(cc));cc.lStructSize  = sizeof(cc);cc.hwndOwner= hWnd;cc.lpCustColors = (LPDWORD)acrCustClr;if (ChooseColor(&cc)){                                                //用選擇的顏色畫一個實心矩形RECT rect = {240, 100, 340, 140};hDC = GetDC(hWnd);HBRUSH hBrush = CreateSolidBrush(cc.rgbResult);SelectObject(hDC, hBrush);FillRect(hDC, &rect, hBrush);DeleteObject(hBrush);ReleaseDC(hWnd, hDC);}}break;case IDC_FONT_DIALOG:{CHOOSEFONT cf;LOGFONT lf;ZeroMemory(&cf, sizeof(cf));cf.lStructSize = sizeof(cf);cf.hwndOwner   = hWnd;cf.lpLogFont   = &lf;cf.Flags       = CF_SCREENFONTS | CF_EFFECTS;if (ChooseFont(&cf)){                                                //用選擇的字型輸出一行測試文本TCHAR str[] = TEXT("Font 測試!");HFONT hFont = CreateFontIndirect(cf.lpLogFont);DWORD rgbCurrent = cf.rgbColors;hDC = GetDC(hWnd);SelectObject(hDC, hFont);SetTextColor(hDC, cf.rgbColors);TextOut(hDC, 200, 170, str, _tcslen(str));DeleteObject(hFont);ReleaseDC(hWnd, hDC);}}break;default:break;}}return 0;case WM_DESTROY:PostQuitMessage(0);return 0 ;}return DefWindowProc (hWnd, message, wParam, lParam);}

以上demo運行後的檔案選擇對話方塊如下:

選擇顏色對話方塊如下:

選擇字型對話方塊如下:

在demo中選擇三個對話方塊後,選擇的檔案、顏色和字型均畫在視窗上:

以上只是示範了檔案開啟/儲存、顏色選擇和字型選擇對話方塊,雖然只示範了最簡單的功能,但也是最基本、最常用的功能,能滿足不少應用需求,更多的函數及用法請參考MSDN,學會查MSDN是Windows平台上開發的必備基礎。

 

關注公眾平台:程式員互動聯盟(coder_online),你可以第一時間擷取原創技術文章,和(java/C/C++/Android/Windows/Linux)技術大牛做朋友,線上交流編程經驗,擷取編程基礎知識,解決編程問題。程式員互動聯盟,開發人員自己的家。

轉載請註明出處http://www.coderonline.net/,謝謝合作!

【Windows編程】系列第八篇:通用對話方塊

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.