山本ワールド
Windowsプログラミング
アルゴリズム Vitual C++ 2008/2013によるWin32/Win64 APIレベルのプログラム 基礎 Vitual C++ 2008/2013によるAPIレベルのプログラム(32/64bit) Wix3でインストーラーを作る Visual C++ 2008 Standard Editonによるフォームアプリケーションのプログラム(32/64bit) Vitual C++ 2008 Standard EditonによるAPIレベルのプログラム(32/64bit) Windows 7対応 Visual C++ 2008 ExpressによるAPIレベルのプログラム Visual C++ 2005 ExpressによるAPIレベルのプログラム Visual C++ Versiosn 5 BORLAND C++ Windowsプログラム全般 Excel VBA その他PrintDlg
概要
Visual C++ 2005 Express に対応。
PrintDlg APIはWindows 98等にも対応。
実行結果
表示されるダイアログ
印刷結果
ソース
printdlg.cpp
#include <windows.h>
#include <TCHAR.H>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);
TCHAR szClassName[] = TEXT("PrintDlg"); //ウィンドウクラス
HINSTANCE hInst;
int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
LPSTR lpsCmdLine, int nCmdShow){
MSG msg;
hInst = hCurInst;
if (!InitApp(hCurInst))
return FALSE;
if (!InitInstance(hCurInst, nCmdShow))
return FALSE;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){
HPEN hPen;
PRINTDLG pd;
DOCINFO di;
TEXTMETRIC tm;
TCHAR szStr[128];
switch (msg) {
case WM_COMMAND:
switch (LOWORD(wp)) {
case IDM_END:
SendMessage(hWnd, WM_CLOSE, 0, 0);
break;
case IDM_PRINT:
memset(&pd, 0, sizeof(PRINTDLG));
pd.lStructSize = sizeof(PRINTDLG);
pd.hwndOwner = hWnd;
pd.hDevMode = NULL;
pd.hDevNames = NULL;
// pd.Flags = デバイスコンテキストを返す 「選択した部分」ラジオボタンを使用不可にします 「ファイルへ出力」チェックボックスを隠します。
pd.Flags = PD_RETURNDC |
PD_NOPAGENUMS | PD_NOSELECTION | PD_HIDEPRINTTOFILE;
pd.nCopies = 1; // 印刷部数1
pd.nFromPage = 1; // スタートページ1
pd.nToPage = 1; // 最後のページ1
pd.nMinPage = 1; // ページ範囲の最小値1
pd.nMaxPage = 1; // ページエディットコントロールの最大値1
memset(&di, 0, sizeof(DOCINFO));
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = TEXT("PrintDlg API");
if (PrintDlg(&pd)==TRUE) { // ダイアログ表示
StartDoc(pd.hDC, &di);
StartPage(pd.hDC);
// 印刷される内容
DEVNAMES * DevNames = (DEVNAMES *)(GlobalLock(pd.hDevNames));
DEVMODE * DevMode = (DEVMODE *)(GlobalLock(pd.hDevMode));
TCHAR * szDriverName = (TCHAR *)(DevNames) + DevNames->wDriverOffset;
TCHAR * szDeviceName = (TCHAR *)(DevNames) + DevNames->wDeviceOffset;
int cx=int(3.5*double(GetDeviceCaps(pd.hDC , LOGPIXELSX))/25.4); //3.5ミリの文字幅を計算(ピクセル)
int cy=cx;
#ifdef UNICODE
HFONT hfont=CreateFont(cx,cy,0,0,0,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH | FF_DONTCARE,TEXT("MS 明朝"));
#else
HFONT hfont=CreateFont(cx,cy,0,0,0,0,0,0,SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH | FF_DONTCARE,TEXT("MS 明朝"));
#endif
SelectObject(pd.hDC,hfont);
GetTextMetrics(pd.hDC, &tm);
int sx=0,sy=cy; // 印刷開始位置(ピクセル)
wsprintf(szStr, TEXT("プリンタ名 %s"),szDeviceName );
TextOut(pd.hDC, sx, sy, szStr, (int)_tcslen(szStr));
wsprintf(szStr, TEXT("ドライババージョン %i"), GetDeviceCaps(pd.hDC , DRIVERVERSION) );
TextOut(pd.hDC, sx, sy+=cy, szStr, (int)_tcslen(szStr));
wsprintf(szStr, TEXT("解像度 %i*%i (DPI)") , GetDeviceCaps(pd.hDC , LOGPIXELSX), GetDeviceCaps(pd.hDC , LOGPIXELSY));
TextOut(pd.hDC, sx,sy+=cy , szStr, (int)_tcslen(szStr));
wsprintf(szStr, TEXT("印刷範囲 %i*%i (ピクセル)") , GetDeviceCaps(pd.hDC ,PHYSICALWIDTH ), GetDeviceCaps(pd.hDC , PHYSICALHEIGHT));
TextOut(pd.hDC, sx, sy+=cy, szStr, (int)_tcslen(szStr));
GlobalUnlock(pd.hDevNames); GlobalFree(pd.hDevNames);
GlobalUnlock(pd.hDevMode); GlobalFree(pd.hDevMode);
double p=double(GetDeviceCaps(pd.hDC , LOGPIXELSY))/25.4; // 1mの線幅を計算(ピクセル)
wsprintf(szStr, TEXT("漢字 %i*%i") , tm.tmAveCharWidth , tm.tmHeight);
TextOut(pd.hDC, sx, sy+=cy, szStr, (int)_tcslen(szStr));
// 印刷範囲を1mの線で印刷
hPen = CreatePen(PS_SOLID,int(p) , RGB(255, 0, 0));
SelectObject(pd.hDC, hPen);
MoveToEx(pd.hDC, 0, 0, NULL);
LineTo(pd.hDC, GetDeviceCaps(pd.hDC ,PHYSICALWIDTH ),0);
LineTo(pd.hDC, GetDeviceCaps(pd.hDC ,PHYSICALWIDTH ),GetDeviceCaps(pd.hDC , PHYSICALHEIGHT));
LineTo(pd.hDC, 0,GetDeviceCaps(pd.hDC , PHYSICALHEIGHT));
LineTo(pd.hDC, 0,0);
// 印刷される内容終了
EndPage(pd.hDC);
EndDoc(pd.hDC);
DelDeleteObject(hfont);
DeleteDC(pd.hDC);
}
}
break;
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0;
}
ATOM InitApp(HINSTANCE hInst){
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = TEXT("PRINTMENU");
wc.lpszClassName = szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
return (RegisterClassEx(&wc));
}
BOOL InitInstance(HINSTANCE hInst, int nCmdShow){
HWND hWnd;
hWnd = CreateWindow(szClassName,
TEXT("PrintDlg"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInst,
NULL);
if (!hWnd)
return FALSE;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
printdlg.rc
#include <windows.h>
#include "resource.h"
PRINTMENU MENU DISCARDABLE
BEGIN
POPUP "ファイル(&F)"
BEGIN
MENUITEM "印刷(&P)..." , IDM_PRINT
MENUITEM "終了(&X)" , IDM_END
END
END
resource.h
#define IDM_END 100
#define IDM_PRINT 110
Copyright (C) 2012 山本ワールド All Rights Reserved.