こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

CDC::SelectObject(CFont*)

いつもお世話になっております。
Visual Studio 2010 Professional
MFC プロジェクト
Windows 7で

CDC::SelectObject(CFont*)

を利用してプリンタの印字フォントを変えようとしているのですが、
文字の大きさが非常に小さくなってしまうことに気づきました。
そこで、
CDC::GetCurrentFont()で取得したCFontから
GetLogFontでLOGFONTを取得し、
CFont::CreateFontIndirect(LOGFONT*)
で作成したフォントを
CDC::SelectObject(CFont*)
で割り当てるように下記プログラムを作成したのですが、
文字が非常に小さくなってしまいます。
SelectObjectする部分をコメントアウトすると通常の大きさで印字されます。
現在のフォントからLOGFONTを取得して、そのフォントを
CDC::SelectObject(CFont*)
で割り当てれば、同じ文字フォントで印字されると考えたのですが、
間違っているのでしょうか。
プリンタデバイスはPrimoPDFです。
正しい印刷文字フォントの設定方法をご存知の方、ご教授よろしくお願い致します。

CDC m_DCPrint;

LPDEVNAMES m_pDevnames;

LPCTSTR m_pDriver;



LPCTSTR m_pDevice;

LPCTSTR m_pOutput;

LPDEVMODE m_pDevMode;

TCHAR m_PrinterName[400];

LOGFONT m_Lf;

DWORD dwBufferSize = 400;

bRet = GetDefaultPrinter(m_PrinterName, &dwBufferSize);

if (!bRet)
return NULL;

m_pDevice = m_PrinterName;

m_pDevMode = GetDevMode (m_PrinterName,hwnd);

m_pDriver = NULL;

m_pOutput = NULL;

bRet = m_DCPrint.CreateDC(m_pDriver, m_pDevice, m_pOutput, m_pDevMode);

CFont * pFont = m_DCPrint.GetCurrentFont();

if(pFont != NULL)
{
pFont->GetLogFont(&m_Lf);
}

CFont font;

CFont * pOldFont;

font.CreateFontIndirect(&m_Lf);

pOldFont = m_DCPrint.SelectObject(&font); //ここをコメントアウトすると通常の文字の大きさ

DOCINFO docinfo;

memset(&docinfo, 0, sizeof(DOCINFO));

docinfo.cbSize = sizeof(DOCINFO);

docinfo.lpszDocName = _T(“title”);

int pagewidth = m_DCPrint.GetDeviceCaps(PHYSICALWIDTH);

int pageheight =m_DCPrint.GetDeviceCaps(PHYSICALHEIGHT);

int leftMargin = 1000 * GetDeviceCaps(m_DCPrint.m_hDC, LOGPIXELSX) / 1000;//ピクセルへ直す
int topMargin = 1000 * GetDeviceCaps(m_DCPrint.m_hDC, LOGPIXELSY) / 1000;//ピクセルへ直す

int rightMargin = 1000 * GetDeviceCaps(m_DCPrint.m_hDC, LOGPIXELSX) / 1000;//ピクセルへ直す
int bottomMargin = 1000 * GetDeviceCaps(m_DCPrint.m_hDC, LOGPIXELSY) / 1000;//ピクセルへ直す

int printwidth = pagewidth - leftMargin - rightMargin;

int printheight = pageheight - topMargin - bottomMargin;

CRect drawRect;

drawRect.left = leftMargin;

drawRect.right = leftMargin + printwidth;

drawRect.top = topMargin;

drawRect.bottom = topMargin + printheight;

m_DCPrint.StartDoc(&docinfo);

m_DCPrint.StartPage();

m_DCPrint.DrawText(_T(“test”),&drawRect,DT_LEFT | DT_WORDBREAK);

m_DCPrint.EndPage();

m_DCPrint.EndDoc()

m_DCPrint.SelectObject(pOldFont); //ここをコメントアウトすると通常の文字の大きさ

// LOGFONT oldLf;

// pOldFont->GetLogFont(&oldLf);

LPDEVMODE GetDevMode (LPTSTR pPrinterName,HWND hwnd)

{

HANDLE hPrinter;

LPDEVMODE pDevMode = NULL;

DWORD dwNeeded;

DWORD dwRet;



if (!OpenPrinter(pPrinterName, &hPrinter, NULL))

return NULL;



dwNeeded = DocumentProperties(hwnd,

hPrinter, /* handle to our printer */

pPrinterName, /* Name of the printer */

NULL, /* Asking for size so */

NULL, /* these are not used. */

0); /* Zero returns buffer size. */

pDevMode = (LPDEVMODE)malloc(dwNeeded);



dwRet = DocumentProperties(hwnd,

hPrinter,

pPrinterName,

pDevMode, /* The address of the buffer to fill. */

NULL, /* Not using the input buffer. */

DM_OUT_BUFFER); /* Have the output buffer filled. */



if (dwRet != IDOK)

{

free(pDevMode);

ClosePrinter(hPrinter);

return NULL;

}

ClosePrinter(hPrinter);



if (dwRet != IDOK)

{

free(pDevMode);

return NULL;

}

return pDevMode;

}

投稿日時 - 2012-10-02 23:14:22

QNo.7729152

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

プリンターのようなデバイスの場合、GetCurrentFontで取得されるフォントのハンドルは、GetStockObject(DEVICE_DEFAULT_FONT)で取得したものと同じになるのではないでしょうか。
その場合、GetLogFontでは正しいフォントの大きさを取得することはできません。
代わりに、CDC::GetTextMetricsでTEXTMETRICを取得して、tmHeightを参照してはどうでしょうか。

投稿日時 - 2012-10-03 14:14:59

あなたにオススメの質問