/*---------------------------------------------------------
print3.c printing with dialog box
2023
-----------------------------------------------------------*/
#include<Windows.h>
HDC GetPrinterDC(void); //in GETPRNDC.C
void PageGDICalls(HDC, int, int); //in PRINT.C
HINSTANCE hInst;
TCHAR szAppName[]=TEXT(“Print3”);
TCHAR szCaption[] = TEXT(“Print Program 3 (Dialog Box)”);
BOOL bUserAbort;
HWND hDlgPrint;
//打印对话框过程
BOOL CALLBACK PrintDlgProc(HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG://对话框初始化
SetWindowText(hDlg, szAppName);//设置标题栏
EnableMenuItem(GetSystemMenu(hDlg, FALSE)/获取胸痛惨淡句柄副本/,
SC_CLOSE, MF_GRAYED);
return TRUE;
//处理打印对话框消息
case WM_COMMAND:
bUserAbort = TRUE;//如果按下Cancel按钮,终止打印
EnableWindow(GetParent(hDlg), TRUE);//启用父窗口,接收鼠标键盘输入
DestroyWindow(hDlg);//关闭对话框
hDlgPrint = NULL;//防止isDialogMessage在消息循环中被调用
return TRUE;
}
return FALSE;
}
//异常终止过程
BOOL CALLBACK AbortProc(HDC hdcPrn, int iCode)
{
MSG msg;
//!bUserAbort=TRUE 兵器消息队列中没有消息时继续打印
while (!bUserAbort&&PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
//如果!hDlgPrint为TRUE或者对话框的消息,则将改消息发送给费模态对话框
if (!hDlgPrint || IsDialogMessage(hDlgPrint, &msg))
{
//不是对话框消息
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return !bUserAbort;//bUserAbort=false时继续打印
}
//打印过程
BOOL PrintMyPage(HWND hwnd)
{
static DOCINFO di = { sizeof(DOCINFO),TEXT(“Print3:Printing”) };
BOOL bSuccess = TRUE;
HDC hdcPrn;
int xPage, yPage;
if (NULL == (hdcPrn = GetPrinterDC()))
return FALSE;
xPage = GetDeviceCaps(hdcPrn, HORZRES);
yPage = GetDeviceCaps(hdcPrn, VERTRES);
EnableWindow(hwnd, FALSE);//禁用窗口鼠标键盘输入
bUserAbort = FALSE;//继续打印
//创建非模态对话框
hDlgPrint = CreateDialog(hInst, TEXT("PrintDilBox"),
hwnd, PrintDlgProc);
//设置一场处理过程
SetAbortProc(hdcPrn, AbortProc);
if (StartDoc(hdcPrn, &di) > 0)
{
if (StartPage(hdcPrn) > 0)
{
PageGDICalls(hdcPrn, xPage, yPage);
if (EndPage(hdcPrn) > 0)
EndDoc(hdcPrn);
else
bSuccess = FALSE;
}
}
else
bSuccess = FALSE;
if(!bUserAbort)//如果用户取消打印----!FALSE
{
EnableWindow(hwnd, TRUE);//重新启用窗口鼠标键盘输入
DestroyWindow(hDlgPrint);//清除打印对话框
}
DeleteDC(hdcPrn);
return bSuccess && !bUserAbort;
}
/*---------------------------------------
POPPAD.C -- Popup Editor
068.c
第68例子:公用对话框-文本编辑器
POPAD.C
POPFILE.C //文件菜单处理
POPFIND. //CSERACH菜单处理
POPFONT.C //字体菜单处理
POPPRINTO.C //打印处理
2023
---------------------------------------*/
#include <windows.h>
#include <commdlg.h>//公用对话框库
#include "resource.h"
//顶层菜单ID:file 0 ,edit 1,search 2,farmat 3,help 4
#define EDITID 1
#define UNTITLED TEXT ("(untitled)")
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK AboutDlgProc(HWND, UINT, WPARAM, LPARAM);
// Functions in POPFILE.C
//初始化File对话框
void PopFileInitialize(HWND);
//创建“打开”文件对话框
BOOL PopFileOpenDlg(HWND, PTSTR, PTSTR);
//创建“保存”文件对话框
BOOL PopFileSaveDlg(HWND, PTSTR, PTSTR);
//读文件
BOOL PopFileRead(HWND, PTSTR);
//写文件
BOOL PopFileWrite(HWND, PTSTR);
// Functions in POPFIND.C
//初始化Find对话框
HWND PopFindFindDlg(HWND);
//初始化FindReplace对话框
HWND PopFindReplaceDlg(HWND);
//查找对话框
BOOL PopFindFindText(HWND, int*, LPFINDREPLACE);
//替换字符串
BOOL PopFindReplaceText(HWND, int*, LPFINDREPLACE);
//查找下一处
BOOL PopFindNextText(HWND, int*);
//无效查找
BOOL PopFindValidFind(void);
// Functions in POPFONT.C
//初始化字体对话框
void PopFontInitialize(HWND);
//选择字体
BOOL PopFontChooseFont(HWND);
//设置字体
void PopFontSetFont(HWND);
//删除字体
void PopFontDeinitialize(void);
// Functions in POPPRNT.C
//打印文件
BOOL PopPrntPrintFile(HINSTANCE, HWND, HWND, PTSTR);
// Global variables
static HWND hDlgModeless;//通用对话框句柄
static TCHAR szAppName[] = TEXT("PopPad");
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
MSG msg;
HWND hwnd;
HACCEL hAccel;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(hInstance, szAppName);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = szAppName;
wndclass.lpszClassName = szAppName;
if (!RegisterClass(&wndclass))
{
MessageBox(NULL, TEXT("This program requires Windows NT!"),
szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindow(szAppName, NULL,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, szCmdLine);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
hAccel = LoadAccelerators(hInstance, szAppName);
while (GetMessage(&msg, NULL, 0, 0))
{
if (hDlgModeless == NULL || !IsDialogMessage(hDlgModeless, &msg))
{
if (!TranslateAccelerator(hwnd, hAccel, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
return msg.wParam;
}
//设置标题
void DoCaption(HWND hwnd, TCHAR* szTitleName)
{
TCHAR szCaption[64 + MAX_PATH];
wsprintf(szCaption, TEXT("%s - %s"), szAppName,
szTitleName[0] ? szTitleName : UNTITLED);
SetWindowText(hwnd, szCaption);
}
//向用户显示消息对话框提示信息
void OkMessage(HWND hwnd, TCHAR* szMessage, TCHAR* szTitleName)
{
TCHAR szBuffer[64 + MAX_PATH];
wsprintf(szBuffer, szMessage, szTitleName[0] ? szTitleName : UNTITLED);
MessageBox(hwnd, szBuffer, szAppName, MB_OK | MB_ICONEXCLAMATION);
}
//是否保存文件
short AskAboutSave(HWND hwnd, TCHAR* szTitleName)
{
TCHAR szBuffer[64 + MAX_PATH];
int iReturn;
wsprintf(szBuffer, TEXT("Save current changes in %s?"),
szTitleName[0] ? szTitleName : UNTITLED);
iReturn = MessageBox(hwnd, szBuffer, szAppName,
MB_YESNOCANCEL | MB_ICONQUESTION);
if (iReturn == IDYES)
if (!SendMessage(hwnd, WM_COMMAND, IDM_FILE_SAVE, 0))
iReturn = IDCANCEL;
return iReturn;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static BOOL bNeedSave = FALSE;
static HINSTANCE hInst;
static HWND hwndEdit;
static int iOffset;
static TCHAR szFileName[MAX_PATH], szTitleName[MAX_PATH];
static UINT messageFindReplace;
int iSelBeg, iSelEnd, iEnable;
LPFINDREPLACE pfr;
switch (message)
{
case WM_CREATE:
hInst = ((LPCREATESTRUCT)lParam)->hInstance;
// Create the edit control child window
//创建编辑控件子对话框
hwndEdit = CreateWindow(TEXT("edit"), NULL,
WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |
WS_BORDER | ES_LEFT | ES_MULTILINE |
ES_NOHIDESEL | ES_AUTOHSCROLL | ES_AUTOVSCROLL,
0, 0, 0, 0,
hwnd, (HMENU)EDITID, hInst, NULL);
SendMessage(hwndEdit, EM_LIMITTEXT, 32000, 0L);
// Initialize common dialog box stuff
PopFileInitialize(hwnd);
PopFontInitialize(hwndEdit);
//注册消息
//定义一个新的窗口消息,仅当多个应用程序必须处理同一条消息时才使用RegisterWindowMessage
//“查找或者替换”对话框会将FINDMSGSTRING注册的消息发送到其所有者窗口的窗口过程
messageFindReplace = RegisterWindowMessage(FINDMSGSTRING);
DoCaption(hwnd, szTitleName);
return 0;
case WM_SETFOCUS:
SetFocus(hwndEdit);
return 0;
case WM_SIZE:
MoveWindow(hwndEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
return 0;
//当下拉菜单或子菜单即将变为活动状态时发送
case WM_INITMENUPOPUP:
switch (lParam)
{
case 1: // Edit menu
// Enable Undo if edit control can do it
EnableMenuItem((HMENU)wParam, IDM_EDIT_UNDO,
SendMessage(hwndEdit, EM_CANUNDO, 0, 0L) ?
MF_ENABLED : MF_GRAYED);
// Enable Paste if text is in the clipboard
EnableMenuItem((HMENU)wParam, IDM_EDIT_PASTE,
IsClipboardFormatAvailable(CF_TEXT) ?
MF_ENABLED : MF_GRAYED);
// Enable Cut, Copy, and Del if text is selected
SendMessage(hwndEdit, EM_GETSEL, (WPARAM)&iSelBeg,
(LPARAM)&iSelEnd);
iEnable = iSelBeg != iSelEnd ? MF_ENABLED : MF_GRAYED;
EnableMenuItem((HMENU)wParam, IDM_EDIT_CUT, iEnable);
EnableMenuItem((HMENU)wParam, IDM_EDIT_COPY, iEnable);
EnableMenuItem((HMENU)wParam, IDM_EDIT_CLEAR, iEnable);
break;
case 2: // Search menu
// Enable Find, Next, and Replace if modeless
// dialogs are not already active
iEnable = hDlgModeless == NULL ?
MF_ENABLED : MF_GRAYED;
EnableMenuItem((HMENU)wParam, IDM_SEARCH_FIND, iEnable);
EnableMenuItem((HMENU)wParam, IDM_SEARCH_NEXT, iEnable);
EnableMenuItem((HMENU)wParam, IDM_SEARCH_REPLACE, iEnable);
break;
}
return 0;
case WM_COMMAND:
// Messages from edit control
if (lParam && LOWORD(wParam) == EDITID)//控件通知码
{
switch (HIWORD(wParam))
{
case EN_UPDATE:
bNeedSave = TRUE;
return 0;
case EN_ERRSPACE://控件不足
case EN_MAXTEXT:
MessageBox(hwnd, TEXT("Edit control out of space."),
szAppName, MB_OK | MB_ICONSTOP);
return 0;
}
break;
}
switch (LOWORD(wParam))
{
// Messages from File menu
case IDM_FILE_NEW:
if (bNeedSave && IDCANCEL == AskAboutSave(hwnd, szTitleName))
return 0;
SetWindowText(hwndEdit, TEXT("\0"));
szFileName[0] = '\0';
szTitleName[0] = '\0';
DoCaption(hwnd, szTitleName);
bNeedSave = FALSE;
return 0;
case IDM_FILE_OPEN:
if (bNeedSave && IDCANCEL == AskAboutSave(hwnd, szTitleName))
return 0;
if (PopFileOpenDlg(hwnd, szFileName, szTitleName))
{
if (!PopFileRead(hwndEdit, szFileName))
{
OkMessage(hwnd, TEXT("Could not read file %s!"),
szTitleName);
szFileName[0] = '\0';
szTitleName[0] = '\0';
}
}
DoCaption(hwnd, szTitleName);
bNeedSave = FALSE;
return 0;
case IDM_FILE_SAVE:
if (szFileName[0])
{
if (PopFileWrite(hwndEdit, szFileName))
{
bNeedSave = FALSE;
return 1;
}
else
{
OkMessage(hwnd, TEXT("Could not write file %s"),
szTitleName);
return 0;
}
}
// fall through
case IDM_FILE_SAVE_AS:
if (PopFileSaveDlg(hwnd, szFileName, szTitleName))
{
DoCaption(hwnd, szTitleName);
if (PopFileWrite(hwndEdit, szFileName))
{
bNeedSave = FALSE;
return 1;
}
else
{
OkMessage(hwnd, TEXT("Could not write file %s"),
szTitleName);
return 0;
}
}
return 0;
case IDM_FILE_PRINT:
if (!PopPrntPrintFile(hInst, hwnd, hwndEdit, szTitleName))
OkMessage(hwnd, TEXT("Could not print file %s"),
szTitleName);
return 0;
case IDM_APP_EXIT:
SendMessage(hwnd, WM_CLOSE, 0, 0);
return 0;
// Messages from Edit menu
case IDM_EDIT_UNDO:
SendMessage(hwndEdit, WM_UNDO, 0, 0);
return 0;
case IDM_EDIT_CUT:
SendMessage(hwndEdit, WM_CUT, 0, 0);
return 0;
case IDM_EDIT_COPY:
SendMessage(hwndEdit, WM_COPY, 0, 0);
return 0;
case IDM_EDIT_PASTE:
SendMessage(hwndEdit, WM_PASTE, 0, 0);
return 0;
case IDM_EDIT_CLEAR:
SendMessage(hwndEdit, WM_CLEAR, 0, 0);
return 0;
case IDM_EDIT_SELECT_ALL:
SendMessage(hwndEdit, EM_SETSEL, 0, -1);
return 0;
// Messages from Search menu
case IDM_SEARCH_FIND:
SendMessage(hwndEdit, EM_GETSEL, 0, (LPARAM)&iOffset);
hDlgModeless = PopFindFindDlg(hwnd);
return 0;
case IDM_SEARCH_NEXT:
SendMessage(hwndEdit, EM_GETSEL, 0, (LPARAM)&iOffset);
if (PopFindValidFind())
PopFindNextText(hwndEdit, &iOffset);
else
hDlgModeless = PopFindFindDlg(hwnd);
return 0;
case IDM_SEARCH_REPLACE:
SendMessage(hwndEdit, EM_GETSEL, 0, (LPARAM)&iOffset);
hDlgModeless = PopFindReplaceDlg(hwnd);
return 0;
case IDM_FORMAT_FONT:
if (PopFontChooseFont(hwnd))
PopFontSetFont(hwndEdit);
return 0;
// Messages from Help menu
case IDM_HELP:
OkMessage(hwnd, TEXT("Help not yet implemented!"),
TEXT("\0"));
return 0;
case IDM_APP_ABOUT:
DialogBox(hInst, TEXT("AboutBox"), hwnd, AboutDlgProc);
return 0;
}
break;
case WM_CLOSE:
if (!bNeedSave || IDCANCEL != AskAboutSave(hwnd, szTitleName))
DestroyWindow(hwnd);
return 0;
case WM_QUERYENDSESSION:
if (!bNeedSave || IDCANCEL != AskAboutSave(hwnd, szTitleName))
return 1;
return 0;
case WM_DESTROY:
PopFontDeinitialize();
PostQuitMessage(0);
return 0;
default:
// Process "Find-Replace" messages
if (message == messageFindReplace)
{
pfr = (LPFINDREPLACE)lParam;
if (pfr->Flags & FR_DIALOGTERM)
hDlgModeless = NULL;
if (pfr->Flags & FR_FINDNEXT)
if (!PopFindFindText(hwndEdit, &iOffset, pfr))
OkMessage(hwnd, TEXT("Text not found!"),
TEXT("\0"));
if (pfr->Flags & FR_REPLACE || pfr->Flags & FR_REPLACEALL)
if (!PopFindReplaceText(hwndEdit, &iOffset, pfr))
OkMessage(hwnd, TEXT("Text not found!"),
TEXT("\0"));
if (pfr->Flags & FR_REPLACEALL)
while (PopFindReplaceText(hwndEdit, &iOffset, pfr));
return 0;
}
break;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
BOOL CALLBACK AboutDlgProc(HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
EndDialog(hDlg, 0);
return TRUE;
}
break;
}
return FALSE;
}