Win32通用對話框編程Demo - 顏色、字體、打開文件、瀏覽文件夾

#include <windows.h>
#include <commdlg.h>
#include<Shlobj.h>
#include "resource.h"
 
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
 
HINSTANCE hInst;
TCHAR szClassName[] = TEXT("commDlgDemo");
 
int WINAPI
WinMain (HINSTANCE hThisInstance,
         HINSTANCE hPrevInstance,
         LPSTR lpszArgument,
         int nFunsterStil)
{
    HWND hwnd;
    MSG messages;
    WNDCLASSEX wincl;
 
	hInst = hThisInstance;
	
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;
    wincl.style = CS_DBLCLKS;
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = MAKEINTRESOURCE (IDC_COMMDLGDEMO);
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
    wincl.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
 
    if (!RegisterClassEx (&wincl))
        return 0;
 
    hwnd = CreateWindowEx (
           0,
           szClassName,
           TEXT("commDlgDemo"),
           WS_OVERLAPPEDWINDOW,
           CW_USEDEFAULT,
           CW_USEDEFAULT,
           400,
           400,
           HWND_DESKTOP,
           NULL,
           hThisInstance,
           NULL
           );
 
    ShowWindow (hwnd, nFunsterStil);
 
    while (GetMessage (&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
 
    return messages.wParam;
}
 
LRESULT CALLBACK
WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;
	HDC hdc;
	RECT rt;
	int ret;
	char szBuffer[100];
	COLORREF acrCustClr[16];// array of custom colors
	CHOOSECOLOR stChooseColor; 
	COLORREF rgbLineColor; 
	CHOOSEFONT cf ;
	LOGFONT lf ;
	DWORD myfsize;
	char FileName[MAX_PATH]= {0};
 	OPENFILENAME ofn = {0};
 	char myfolder[MAX_PATH] = { 0 };
	BROWSEINFO bi = { 0 };
				
    switch (message)
    {
			case WM_COMMAND:
    		switch (LOWORD(wParam))
    		{
   			case IDM_sysColorDlg:
				stChooseColor.lStructSize    = sizeof(CHOOSECOLOR) ;
	            stChooseColor.hwndOwner      = hwnd ;
	            stChooseColor.rgbResult      = rgbLineColor ;
	            stChooseColor.lpCustColors   = (LPDWORD) acrCustClr ;
	            stChooseColor.Flags          = CC_RGBINIT ;
	            stChooseColor.lCustData      = 0 ;
	            stChooseColor.lpfnHook       = NULL ;
	            stChooseColor.lpTemplateName = NULL ;
				
				if (ChooseColor(&stChooseColor))
				{
    				rgbLineColor = stChooseColor.rgbResult;
    				BYTE r = GetRValue(rgbLineColor);
					BYTE g = GetGValue(rgbLineColor);
					BYTE b = GetBValue(rgbLineColor);
    				wsprintf(szBuffer, "紅:0x%x,綠:0x%x,藍:0x%x",r,g,b);
    				MessageBox(NULL,szBuffer,TEXT("返回顏色值"),0);
				}
   				break;
			case IDM_sysFontDlg:
				cf.lStructSize = sizeof (CHOOSEFONT) ;
		        cf.hwndOwner = hwnd ;
		        cf.hDC = NULL ;
		        cf.lpLogFont = &lf ;
		        cf.iPointSize = 0 ;
		        cf.Flags = CF_INITTOLOGFONTSTRUCT |
		            CF_SCREENFONTS | CF_EFFECTS ;
		        cf.rgbColors = 0 ;
		        cf.lCustData = 0 ;
		        cf.lpfnHook = NULL ;
		        cf.lpTemplateName = NULL ;
		        cf.hInstance = NULL ;
		        cf.lpszStyle = NULL ;
		        cf.nFontType = 0 ;
		        cf.nSizeMin = 0 ;
		        cf.nSizeMax = 0 ;
		        if (ChooseFont (&cf))
		        {
        			myfsize=cf.iPointSize;
        			wsprintf(szBuffer, "選擇的字號大小是:%d (單位1/10磅)",myfsize);
    				MessageBox(NULL,szBuffer,TEXT("系統字體對話框"),0);
        		}
				break;
			case IDM_sysFileDlg:
				ofn.lStructSize = sizeof(OPENFILENAME);
        		ofn.hwndOwner = hwnd ;
        		ofn.lpstrFilter = "All Files (*.*)\0*.*\0\0";
        		ofn.nMaxFile = MAX_PATH ;
        		ofn.nMaxFileTitle = MAX_PATH ;
        		ofn.lpstrFile = FileName ;
        		ofn.lpstrTitle = "打開文件對話框Demo";
        		ofn.Flags = OFN_HIDEREADONLY |OFN_CREATEPROMPT ;
        		if(GetOpenFileName(&ofn))
        		{
		        	MessageBox(NULL,FileName,"選擇的文件是",0);	
		        }        
				break;
			case IDM_SHFolderDlg:
				bi.hwndOwner = hwnd;
				bi.pszDisplayName = myfolder;//接收文件夾的緩衝區
				bi.lpszTitle = TEXT("瀏覽選擇文件夾對話框Demo");//標題
				bi.ulFlags = BIF_NEWDIALOGSTYLE;
				LPITEMIDLIST idl = SHBrowseForFolder(&bi);
				if (SHGetPathFromIDList(idl, myfolder)){
					MessageBox(NULL, myfolder, TEXT("你選擇的文件夾"), 0);
				}
				break;
		    case IDM_ABOUT:
				MessageBox (hwnd, TEXT ("commDlgDemo v1.0\nCopyright (C) 2020\n by bo"),
                        TEXT ("commDlgDemo"), MB_OK | MB_ICONINFORMATION);
				break;
			case IDM_EXIT:
				DestroyWindow(hwnd);
				break;
			default:
				return DefWindowProc(hwnd, message, wParam, lParam);	    		
		    }
    		break;
    	case WM_PAINT:
			hdc = BeginPaint(hwnd, &ps);					
			GetClientRect(hwnd, &rt);			
			
			EndPaint(hwnd, &ps);
			break;
        case WM_DESTROY:
            PostQuitMessage (0);
            break;
        default:
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}

字體,顏色,打開文件對話框,包含頭文件 #include <commdlg.h>;

都是先定義一個結構體,賦值,再調用函數打開對話框;然後獲取返回值;具體見代碼;

系統顏色對話框;

選擇了紅色返回;

選擇了一種類似綠色返回;

選擇了黑色返回;

返回的顏色值使用如下代碼提取顏色分量;

BYTE r = GetRValue(rgbLineColor);

系統字體對話框:

選擇的字號:返回的結構體成員.iPointSize是選擇的字號大小;四號字體返回;

八號字體返回;

打開文件對話框;

返回選擇的文件;

系統瀏覽文件夾對話框;跟前面三個不同;這個是Windows API的Shell編程;

需要包含#include<Shlobj.h>;並且函數是SH開頭的;

返回選擇的文件夾;

菜單;

工程;

資源和頭文件;

#include "resource.h"
#include <windows.h>

/////////////////////////////////////////////////////////////////////////////
//
// Menu
//

IDC_COMMDLGDEMO MENU 
BEGIN
    POPUP "&File"
    BEGIN
    	MENUITEM "系統顏色對話框",    IDM_sysColorDlg
    	MENUITEM "字體選擇對話框",    IDM_sysFontDlg
    	MENUITEM "打開文件對話框",    IDM_sysFileDlg
    	MENUITEM "瀏覽文件夾對話框",  IDM_SHFolderDlg 
        MENUITEM "E&xit",                	IDM_EXIT
    END
    POPUP "&Help"
    BEGIN
        MENUITEM "&About ...",           	IDM_ABOUT
    END
END
#define 	IDM_EXIT		10001
#define 	IDM_ABOUT		10002

#define 	IDC_COMMDLGDEMO		10101
#define 	IDD_ABOUTBOX	10102
#define     IDM_sysColorDlg    40001
#define     IDM_sysFontDlg    40002
#define     IDM_sysFileDlg    40003
#define     IDM_SHFolderDlg   40004

這是初始化結構體所有成員爲0;

BROWSEINFO bi = { 0 };

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章