📄 cmndlg32.c
字号:
/****************************************************************************
*
*
* PROGRAM: cmndlg.c
*
* PURPOSE: Sample demonstrating common dialogs in Windows Chicago
*
* FUNCTIONS:
*
* WinMain() - calls initialization function, processes message loop
* InitApplication() - initializes window data and registers window
* InitInstance() - saves instance handle and creates main window
* MainWndProc() - processes messages
* About() - processes messages for "About" dialog box
* OpenNewFile() - opens a new file
* SaveToFile() - saves the current text buffer to the current filename
* SaveAs() - saves the current text buffer to a new file name
* EnterNew() - to enter new text into the text buffer
* FileOpenHookProc() - Hook procedure for GetOpenFileName() common dialog
* FileSaveHookProc() - Hook procedure for GetSaveFileName() common dialog
* ChooseFontHookProc() - Hook procedure for ChooseFont() common dialog
* FindTextHookProc() - Hook procedure for FindText() common dialog
* ReplaceTextHookProc() - Hook procedure for the ReplaceText() common dialog
* PrintDlgHookProc() - Hook procedure for the PrintDlg() common dialog
* PrintSetupHookProc() - Hook procedure for the PrintDlg() setup common dialog
* SearchFile() - Searches for the specified text in the file buffer
* ChooseNewFont() - chooses a new font for display
* ChooseNewColor() - chooses a new color for display
* PrintFile() - prints the current text in the file buffer
* CallFindText() - calls the FindText() common dialog function
* CallReplaceText() - calls the ReplaceText() common dialog function
* ProcessCDError() - uses CommonDialogExtendedError() to output useful error messages
*
* COMMENTS:
*
*
* The common dialog APIs demonstrated in the sample include:
*
* ChooseColor()
* ChooseFont()
* FindText()
* GetOpenFileName()
* GetSaveFileName()
* PrintDlg()
* ReplaceText()
*
*
* Each dialog box is demonstrated being used in three different ways:
* standard, using a modified template and using a hook function.
*
*
****************************************************************************/
#include <windows.h> // includes basic windows functionality
#include <commdlg.h> // includes common dialog functionality
#include <dlgs.h> // includes common dialog template defines
#include <stdio.h> // includes standard file i/o functionality
#include <string.h> // includes string functions
#include <cderr.h> // includes the common dialog error codes
#include <commctrl.h>
#include "resource.h"
#include "cmndlg32.h" // includes my common dialog functions
HANDLE hInst;
OPENFILENAME OpenFileName;
TCHAR szDirName[256] = "";
TCHAR szFile[256] = "\0";
TCHAR szFileTitle[256];
// Filter specification for the OPENFILENAME struct
// This is portable for i386 and MIPS
// Leaving out the \0 terminator will cause improper DWORD alignment
// and cause a failure under MIPS
TCHAR szFilter[] = "Text Files (*.TXT)\0*.TXT\0All Files (*.*)\0*.*\0";
TCHAR FileBuf[FILE_LEN];
DWORD dwFileSize;
UINT FindReplaceMsg;
TCHAR szFindString[64] = "";
TCHAR szReplaceString[64] = "";
FINDREPLACE frText;
LPFINDREPLACE lpFR;
TCHAR * lpBufPtr = FileBuf;
CHOOSEFONT chf;
CHOOSECOLOR chsclr;
COLORREF crColor;
LOGFONT lf;
WORD wMode = IDM_STANDARD;
HWND hDlgFR = NULL;
PRINTDLG pd;
PAGESETUPDLG psDlg;
BOOL bNewShell;
HWND hWndStatus; // handle for status bar window
/****************************************************************************
*
* FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int)
*
* PURPOSE: calls initialization function, processes message loop
*
* COMMENTS:
*
*
****************************************************************************/
int APIENTRY WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
DWORD dwVersion;
MSG msg; /* message */
dwVersion = GetVersion();
if (dwVersion < 0x80000000)
bNewShell = FALSE;
else
bNewShell = TRUE;
if (!InitApplication(hInstance)) /* Initialize shared things */
return (FALSE); /* Exits if unable to initialize */
hInst = hInstance;
lpBufPtr = &FileBuf[0];
InitCommonControls();
/* Perform initializations that apply to a specific instance */
if (!InitInstance(hInstance, nCmdShow))
return (FALSE);
// register window message for FindText() and ReplaceText() hook procs
FindReplaceMsg = RegisterWindowMessage( (LPTSTR) FINDMSGSTRING );
/* Acquire and dispatch messages until a WM_QUIT message is received. */
while (GetMessage(&msg,NULL,0,0))
if ( !hDlgFR || !IsWindow(hDlgFR) || !IsDialogMessage( hDlgFR, &msg ) )
{
TranslateMessage(&msg); /* Translates virtual key codes */
DispatchMessage(&msg); /* Dispatches message to window */
}
return (msg.wParam); /* Returns the value from PostQuitMessage */
// avoid compiler warnings at W3
lpCmdLine;
}
/****************************************************************************
*
* FUNCTION: InitApplication(HANDLE)
*
* PURPOSE: Initializes window data and registers window class
*
* COMMENTS:
*
* In this function, we initialize a window class by filling out a data
* structure of type WNDCLASS and calling the Windows RegisterClass()
* function.
*
****************************************************************************/
BOOL InitApplication(HANDLE hInstance) /* current instance */
{
WNDCLASS wc;
/* Fill in window class structure with parameters that describe the */
/* main window. */
wc.style = 0; /* Class style(s). */
wc.lpfnWndProc = (WNDPROC)MainWndProc;
wc.cbClsExtra = 0; /* No per-class extra data. */
wc.cbWndExtra = 0; /* No per-window extra data. */
wc.hInstance = hInstance; /* Application that owns the class. */
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = "CmnDlgMenu"; /* Name of menu resource in .RC file. */
wc.lpszClassName = "CmnDlgWClass"; /* Name used in call to CreateWindow. */
/* Register the window class and return success/failure code. */
return (RegisterClass(&wc));
}
/****************************************************************************
*
* FUNCTION: InitInstance(HANDLE, int)
*
* PURPOSE: Saves instance handle and creates main window
*
* COMMENTS:
*
* In this function, we save the instance handle in a static variable and
* create and display the main program window.
*
****************************************************************************/
BOOL InitInstance(
HANDLE hInstance, /* Current instance identifier. */
int nCmdShow) /* Param for first ShowWindow() call. */
{
HWND hWnd; /* Main window handle. */
/* Save the instance handle in static variable, which will be used in */
/* many subsequence calls from this application to Windows. */
hInst = hInstance;
/* Create a main window for this application instance. */
hWnd = CreateWindow(
"CmnDlgWClass",
"Common Dialogs Sample Application",
WS_OVERLAPPEDWINDOW, /* Window style. */
CW_USEDEFAULT, /* Default horizontal position. */
CW_USEDEFAULT, /* Default vertical position. */
CW_USEDEFAULT, /* Default width. */
CW_USEDEFAULT, /* Default height. */
NULL, /* Overlapped windows have no parent. */
NULL, /* Use the window class menu. */
hInstance, /* This instance owns this window. */
NULL /* Pointer not needed. */
);
/* If window could not be created, return "failure" */
if (!hWnd)
return (FALSE);
/* Make the window visible; update its client area; and return "success" */
ShowWindow(hWnd, nCmdShow); /* Show the window */
UpdateWindow(hWnd); /* Sends WM_PAINT message */
return (TRUE); /* Returns the value from PostQuitMessage */
}
/****************************************************************************
*
* FUNCTION: MainWndProc(HWND, unsigned, WORD, LONG)
*
* PURPOSE: Processes messages
*
* COMMENTS:
*
* This function processes all messags sent to the window. When the
* user choses one of the options from one of the menus, the command
* is processed here and passed onto the function for that command.
* This function also processes the special "FindReplace" message that
* this application registers for hook processing of the FindText()
* and ReplaceText() common dialog functions.
*
****************************************************************************/
LONG APIENTRY MainWndProc(
HWND hWnd, /* window handle */
UINT message, /* type of message */
UINT wParam, /* additional information */
LONG lParam) /* additional information */
{
HDC hDC;
PAINTSTRUCT ps;
INT nDrawX;
INT nDrawY;
HFONT hFont;
HANDLE Handle;
static BOOL NewFont;
RECT rcl;
switch (message) {
case WM_CREATE:
//initialize the output on the screen
strcpy( FileBuf, "Hello World!");
lpBufPtr = FileBuf;
dwFileSize = strlen(FileBuf);
crColor = 0;
NewFont = FALSE;
hWndStatus = CreateWindowEx(
0L, // extended style
STATUSCLASSNAME, // create a status bar
"", // Window name
WS_CHILD | WS_BORDER | WS_VISIBLE | SBS_SIZEGRIP, // window styles
-100, -100, 10, 10, // x, y, Width, Height
hWnd, // parent window
(HMENU)10, // ID
hInst, // instance
NULL ); // window data
if (hWndStatus == NULL)
MessageBox (NULL, "Status Bar not created!", NULL, MB_OK );
if (bNewShell)
{
EnableMenuItem( GetMenu( hWnd ), IDM_PAGESETUP,
MF_BYCOMMAND | MF_ENABLED );
DrawMenuBar( hWnd );
}
break;
case WM_PAINT:
/* Set up a display context to begin painting */
hDC = BeginPaint (hWnd, &ps);
GetClientRect(hWnd, &rcl);
FillRect( hDC, &rcl, GetStockObject(WHITE_BRUSH));
/* Initialize drawing position to 1/4 inch from the top */
/* and from the left of the top, left corner of the */
/* client area of the main windows. */
nDrawX = GetDeviceCaps(hDC, LOGPIXELSX) / 4; /* 1/4 inch */
nDrawY = GetDeviceCaps(hDC, LOGPIXELSY) / 4; /* 1/4 inch */
if ( NewFont == TRUE )
{
hFont = CreateFontIndirect( &lf );
Handle = SelectObject( hDC, hFont );
}
SetTextColor( hDC, crColor );
TextOut (hDC, nDrawX, nDrawY, FileBuf, dwFileSize);
// end painting and release hDC
EndPaint( hWnd, &ps );
break;
case WM_COMMAND: /* message: command from application menu */
switch( LOWORD( wParam ))
{
case IDM_OPENFILE:
if ( OpenNewFile( hWnd ) == TRUE )
{
// enable the Save As and Print menu items
EnableMenuItem( GetMenu( hWnd ), IDM_SAVEFILE,
MF_BYCOMMAND | MF_ENABLED );
EnableMenuItem( GetMenu( hWnd ), IDM_PRINT,
MF_BYCOMMAND | MF_ENABLED );
DrawMenuBar( hWnd);
// reset the title in the title bar to reflect the
// new open file
SetWindowText( hWnd, OpenFileName.lpstrFile );
// reset the current color and current font to the
// default
crColor = 0;
NewFont = FALSE;
InvalidateRect( hWnd, NULL, TRUE );
}
break;
case IDM_SAVEFILE:
OpenFileName.Flags = 0L;
SaveToFile( hWnd );
break;
case IDM_SAVEFILEAS:
if ( SaveAs( hWnd ) == TRUE )
{
EnableMenuItem( GetMenu( hWnd ), IDM_SAVEFILE,
MF_BYCOMMAND | MF_ENABLED );
SetWindowText( hWnd, OpenFileName.lpstrFile );
DrawMenuBar( hWnd );
}
break;
case IDM_EXIT:
PostQuitMessage(0);
break;
case IDM_PRINT:
PrintFile( hWnd );
break;
case IDM_PAGESETUP:
PageSetup(hWnd);
break;
case IDM_CHOOSECOLOR:
if (ChooseNewColor( hWnd ))
InvalidateRect( hWnd, NULL, TRUE );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -