#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 };