<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # Windows API 對話框 > 原文: [http://zetcode.com/gui/winapi/dialogs/](http://zetcode.com/gui/winapi/dialogs/) 對話框窗口或對話框是大多數現代 GUI 應用必不可少的部分。 對話被定義為兩個或更多人之間的對話。 在計算機應用中,對話框是一個窗口,用于與應用“對話”。 對話框用于輸入數據,修改數據,更改應用設置等。對話框是用戶與計算機程序之間進行通信的重要手段。 ## 非模態對話框 非模態對話框不會限制您使用特定的窗口。 用戶可以在對話框和程序的其他窗口之間切換。 典型的非模態對話框是“查找和替換”對話框或浮動工具欄。 ```c #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM); void CreateDialogBox(HWND); void RegisterDialogClass(HWND); HINSTANCE ghInstance; int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) { MSG msg; HWND hwnd; WNDCLASSW wc = {0}; wc.lpszClassName = L"Window"; wc.hInstance = hInstance; wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE); wc.lpfnWndProc = WndProc; RegisterClassW(&wc); hwnd = CreateWindowW(wc.lpszClassName, L"Window", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 250, 150, NULL, NULL, hInstance, NULL); ghInstance = hInstance; while( GetMessage(&msg, NULL, 0, 0)) { DispatchMessage(&msg); } return (int) msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_CREATE: RegisterDialogClass(hwnd); CreateWindowW(L"button", L"Show dialog", WS_VISIBLE | WS_CHILD , 20, 50, 95, 25, hwnd, (HMENU) 1, NULL, NULL); break; case WM_COMMAND: CreateDialogBox(hwnd); break; case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProcW(hwnd, msg, wParam, lParam); } LRESULT CALLBACK DialogProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_CREATE: CreateWindowW(L"button", L"Ok", WS_VISIBLE | WS_CHILD , 50, 50, 80, 25, hwnd, (HMENU) 1, NULL, NULL); break; case WM_COMMAND: DestroyWindow(hwnd); break; case WM_CLOSE: DestroyWindow(hwnd); break; } return (DefWindowProcW(hwnd, msg, wParam, lParam)); } void RegisterDialogClass(HWND hwnd) { WNDCLASSEXW wc = {0}; wc.cbSize = sizeof(WNDCLASSEXW); wc.lpfnWndProc = (WNDPROC) DialogProc; wc.hInstance = ghInstance; wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE); wc.lpszClassName = L"DialogClass"; RegisterClassExW(&wc); } void CreateDialogBox(HWND hwnd) { CreateWindowExW(WS_EX_DLGMODALFRAME | WS_EX_TOPMOST, L"DialogClass", L"Dialog Box", WS_VISIBLE | WS_SYSMENU | WS_CAPTION , 100, 100, 200, 150, NULL, NULL, ghInstance, NULL); } ``` 對話框只是一種特殊的窗口。 它被創建為帶有某些特定標志的普通窗口。 ```c CreateWindowExW(WS_EX_DLGMODALFRAME | WS_EX_TOPMOST, L"DialogClass", L"Dialog Box", WS_VISIBLE | WS_SYSMENU | WS_CAPTION , 100, 100, 200, 150, NULL, NULL, ghInstance, NULL); ``` 使用常規標志`WS_VISIBLE | WS_SYSMENU | WS_CAPTION`和擴展標志`WS_EX_DLGMODALFRAME | WS_EX_TOPMOST`的組合創建對話框。 ![Modeless dialog](https://img.kancloud.cn/8c/18/8c185561d83546507f3526483a7143db_200x150.jpg) 圖:非模態對話 ## 常用對話框 這些是用于執行常見任務的對話框。 打開和保存文件,打印文檔,選擇顏色等。通用對話框為程序員節省了大量工作。 它們有助于促進應用中的標準。 ### 顏色對話框 這是選擇顏色的常用對話框。 ```c #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK PanelProc(HWND, UINT, WPARAM, LPARAM); void RegisterPanel(void); COLORREF ShowColorDialog(HWND); COLORREF gColor = RGB(255, 255, 255); int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) { MSG msg ; WNDCLASSW wc = {0}; wc.lpszClassName = L"Color dialog box"; wc.hInstance = hInstance; wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE); wc.lpfnWndProc = WndProc; RegisterClassW(&wc); CreateWindowW( wc.lpszClassName, L"Color dialog box", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 150, 150, 250, 200, 0, 0, hInstance, 0); while( GetMessage(&msg, NULL, 0, 0)) { DispatchMessage(&msg); } return (int) msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static HWND hwndPanel; switch(msg) { case WM_CREATE: { CreateWindowW(L"button", L"Color", WS_VISIBLE | WS_CHILD , 20, 30, 80, 25, hwnd, (HMENU) 1, NULL, NULL); RegisterPanel(); hwndPanel = CreateWindowW(L"Panel", NULL, WS_CHILD | WS_VISIBLE, 130, 30, 80, 80, hwnd, (HMENU) 2, NULL, NULL); break; } case WM_COMMAND: { gColor = ShowColorDialog(hwnd); InvalidateRect(hwndPanel, NULL, TRUE); break; } case WM_DESTROY: { PostQuitMessage(0); break; } } return DefWindowProcW(hwnd, msg, wParam, lParam); } LRESULT CALLBACK PanelProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; switch(msg) { case WM_PAINT: { GetClientRect(hwnd, &rect); hdc = BeginPaint(hwnd, &ps); SetBkColor(hdc, gColor); ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rect, "", 0, NULL); EndPaint(hwnd, &ps); break; } } return DefWindowProc(hwnd, msg, wParam, lParam); } COLORREF ShowColorDialog(HWND hwnd) { CHOOSECOLOR cc; static COLORREF crCustClr[16]; ZeroMemory(&cc, sizeof(cc)); cc.lStructSize = sizeof(cc); cc.hwndOwner = hwnd; cc.lpCustColors = (LPDWORD) crCustClr; cc.rgbResult = RGB(0, 255, 0); cc.Flags = CC_FULLOPEN | CC_RGBINIT; ChooseColor(&cc); return cc.rgbResult; } void RegisterPanel(void) { WNDCLASSW rwc = {0}; rwc.lpszClassName = L"Panel"; rwc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); rwc.lpfnWndProc = PanelProc; RegisterClassW(&rwc); } ``` 在我們的示例中,我們有一個按鈕控件和一個子窗口。 子窗口的顏色在開始時為白色。 我們可以通過按下按鈕并選擇自定義顏色值來更改子窗口的顏色。 ```c COLORREF gColor = RGB(255, 255, 255); ``` 我們定義一個全局顏色值; 默認情況下為白色。 ```c gColor = ShowColorDialog(hwnd); ``` 顏色對話框顯示在`ShowColorDialog()`用戶函數中。 該函數返回所選的顏色值。 ```c CHOOSECOLOR cc; ``` 要創建顏色對話框,我們必須定義并填充`CHOOSECOLOR`結構。 ```c cc.rgbResult = RGB(0, 255, 0); cc.Flags = CC_FULLOPEN | CC_RGBINIT; ``` 如果我們提供`CC_RGBINIT`,則顯示對話框時,`rgbResult`成員是最初選擇的顏色。 如果用戶單擊確定按鈕,則`rgbResult`指定用戶的顏色選擇。 ```c ChooseColor(&cc); ``` 顯示顏色對話框。 ```c gColor = ShowColorDialog(hwnd); InvalidateRect(hwndPanel, NULL, TRUE); ``` 獲得顏色值后,我們調用`InvalidateRect()`函數。 此函數會將`WM_PAINT`消息發送到我們的子窗口。 ```c SetBkColor(hdc, gColor); ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rect, "", 0, NULL); ``` 在面板過程中,我們更改子窗口的背景色。 除了在窗口上顯示文本之外,`ExtTextOut()`函數還可以更改窗口的背景色。 我們不會顯示任何文本,我們只會更改背景顏色。 如果提供`ETO_OPAQUE`標志,則`ExtTextOut()`函數將使用`SetBkColor()`函數指定的顏色。 ![Color dialog box](https://img.kancloud.cn/7b/d0/7bd0d37c5c8606130ed8090a30c0b06a_453x324.jpg) 圖:顏色對話框 box ### 文件打開對話框 這是打開文件的常用對話框。 不要使用 UNICODE 編譯此示例。 ```c #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); void CreateMenubar(HWND); void OpenDialog(HWND); void LoadFile(LPSTR); #define IDM_FILE_NEW 1 HWND ghwndEdit; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg ; WNDCLASS wc = {0}; wc.lpszClassName = TEXT( "Opendialog" ); wc.hInstance = hInstance ; wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE); wc.lpfnWndProc = WndProc ; wc.hCursor = LoadCursor(0, IDC_ARROW); RegisterClass(&wc); CreateWindow( wc.lpszClassName, TEXT("Opendialog"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, 150, 150, 265, 200, 0, 0, hInstance, 0); while( GetMessage(&msg, NULL, 0, 0)) { DispatchMessage(&msg); } return (int) msg.wParam; } LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_CREATE: ghwndEdit = CreateWindowEx(WS_EX_RIGHTSCROLLBAR, TEXT("edit"), NULL, WS_VISIBLE | WS_CHILD | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE, 0, 0, 260, 180, hwnd, (HMENU) 1, NULL, NULL); CreateMenubar(hwnd); break; case WM_SIZE: SetWindowPos(ghwndEdit, NULL, 0, 0, LOWORD(lParam), HIWORD(lParam), SWP_NOMOVE | SWP_NOZORDER); break; case WM_COMMAND: if (wParam==IDM_FILE_NEW) { OpenDialog(hwnd); } break; case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hwnd, msg, wParam, lParam); } void CreateMenubar(HWND hwnd) { HMENU hMenubar; HMENU hMenu; hMenubar = CreateMenu(); hMenu = CreateMenu(); AppendMenu(hMenubar, MF_POPUP, (UINT_PTR)hMenu, TEXT("&File")); AppendMenu(hMenu, MF_STRING, IDM_FILE_NEW, TEXT("&Open")); SetMenu(hwnd, hMenubar); } void OpenDialog(HWND hwnd) { OPENFILENAME ofn; TCHAR szFile[MAX_PATH]; ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.lpstrFile = szFile; ofn.lpstrFile[0] = '\0'; ofn.hwndOwner = hwnd; ofn.nMaxFile = sizeof(szFile); ofn.lpstrFilter = TEXT("All files(*.*)\0*.*\0"); ofn.nFilterIndex = 1; ofn.lpstrInitialDir = NULL; ofn.lpstrFileTitle = NULL; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; if(GetOpenFileName(&ofn)) LoadFile(ofn.lpstrFile); } void LoadFile(LPSTR file) { HANDLE hFile; DWORD dwSize; DWORD dw; LPBYTE lpBuffer = NULL; hFile = CreateFile(file, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); dwSize = GetFileSize(hFile, NULL); lpBuffer = (LPBYTE) HeapAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS, dwSize + 1); ReadFile(hFile, (LPWSTR)lpBuffer, dwSize, &dw, NULL); CloseHandle(hFile); lpBuffer[dwSize] = 0; SetWindowText(ghwndEdit, (LPSTR) lpBuffer); HeapFree(GetProcessHeap(), 0, lpBuffer); } ``` 在這個例子中,我們創建一個帶有多行編輯控件的窗口。 要創建一個文件打開對話框,我們創建并填充`OPENFILENAME`結構。 ```c ofn.lpstrFile = szFile; ``` 如果`OpenFileName()`函數返回`TRUE`,則所選文件的名稱位于`lpstrFile`成員中。 ```c ofn.lpstrFilter = TEXT("All files(*.*)\0*.*\0"); ``` 這定義了文件過濾器。 在我們的示例中,對話框顯示所有文件類型。 ```c ofn.nFilterIndex = 1; ``` 在“文件類型”組合框控件中指定當前所選過濾器的索引。 ```c if(GetOpenFileName(&ofn)) LoadFile(ofn.lpstrFile); ``` 我們調用`GetOpenFileName()`函數顯示“打開文件”對話框。 如果單擊“打開”按鈕,該函數將返回`TRUE`,然后調用用戶定義的`LoadFile()`函數。 在`LoadFile()`函數內部,我們讀取文件并將文件內容放入編輯控件中。 我們創建一個文件句柄。 比我們找出文件大小。 為文件內容分配動態內存。 將內容讀入內存,然后將其放入編輯控件。 要將內容放入編輯控件,我們調用`SetWindowText()`函數。 我們一定不要忘記關閉文件句柄并釋放動態內存。 ![Openfile dialog box](https://img.kancloud.cn/3f/52/3f527f672e2f69fe98ab74c28940b677_625x434.jpg) 圖:打開文件對話框 在 Windows API 教程的這一部分中,我們使用了對話框。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看