打印消息对话框

/*---------------------------------------------------------
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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值