用API 在创建的窗口上写字的时候发现一个问题,FONT 的句柄必须声明为全局变量,否则在选入字体的时候会返回失败。
VC 和EVC在创建字体的方法有点不大一样。VC版如下:
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{ HDC hdc=NULL;
PAINTSTRUCT ps;
RECT rt;
HBRUSH hbrBkgnd;
static HPEN hpenDot; // handle of dotted pen
static HFONT hFont;
LOGFONT lf;
switch(message){
case WM_CREATE:
hpenDot = CreatePen(PS_DOT, 2, RGB(255, 0, 0)); //创建虚线画笔
hFont=CreateFont( // Create Font
15, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_NORMAL, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
_T("Arial")); // lpszFacename
break;
case WM_COMMAND:
break; // do nothing
case WM_PAINT:
SetWindowText(hWnd,"Text test");
hdc = BeginPaint(hWnd, &ps);
if(NULL==SelectObject(hdc,hFont))
MessageBox(NULL,"fail font","debug",0);
if(NULL==SelectObject(hdc,hpenDot))
MessageBox(NULL,"fail pen","debug",0);
GetClientRect(hWnd, &rt);
_stprintf(szMsg,"((%d,%d),(%d,%d))",rt.left,rt.top,rt.right,rt.bottom);
//SetBkColor(hdc,RGB(255,0,0));
// DrawText(hdc, szMsg, strlen(szMsg), &rt, DT_CENTER);
TextOut(hdc,10,10,szMsg,strlen(szMsg));
Rectangle(hdc,100, 100, 550,250);
EndPaint(hWnd, &ps);
UpdateWindow(ghWnd);
break;
case WM_CLOSE:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
return DefWindowProc(hWnd,message,wParam,lParam);
}
EVC 版:
LRESULT CALLBACK DlgProc_Panel(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
static HDC hdc;
static PAINTSTRUCT ps;
static RECT rt;
static HBRUSH hBrush;
static COLORREF wColor=RGB(0,0,0);
static int nDrawTimes=0;
static HFONT hFont;
static LOGFONT m_logfnt;
TCHAR lfFaceName[32]= TEXT("Times New Roman");
m_logfnt.lfCharSet=DEFAULT_CHARSET;
m_logfnt.lfClipPrecision=CLIP_DEFAULT_PRECIS;
m_logfnt.lfEscapement=0;
m_logfnt.lfHeight=80;
m_logfnt.lfItalic=false;
m_logfnt.lfOrientation=0;
m_logfnt.lfPitchAndFamily=FF_SWISS;
m_logfnt.lfQuality=DEFAULT_QUALITY;
m_logfnt.lfStrikeOut=false;
m_logfnt.lfUnderline=true;
m_logfnt.lfWeight=800;
m_logfnt.lfWidth=20;
m_logfnt.lfOutPrecision=OUT_DEFAULT_PRECIS;
switch (message)
{
case WM_INITDIALOG:
hFont=CreateFontIndirect(&m_logfnt);
nDrawTimes=0;
wColor=RGB(255,0,0);
MoveWindowFullScreen(hDlg);
break;
case WM_PAINT:
hdc = BeginPaint(hDlg, &ps);
GetClientRect(hDlg, &rt);
hBrush=CreateSolidBrush(wColor);
FillRect(hdc,&rt,hBrush);
//TextOut(hdc, rt.left+10, rt.top+100, "Test", 4);
SelectObject(hdc,hFont);
SetTextColor(hdc,RGB(0,0,255));
rt.top += rt.bottom/2;
DrawText(hdc,TEXT("Test\n"),-1,&rt,DT_CENTER);
DeleteObject(hBrush);
EndPaint(hDlg, &ps);
break;
case WM_LBUTTONDOWN:
case WM_KEYUP:
InvalidateRect(hDlg,&rt,TRUE);
EndDialog(hDlg,TRUE);
break;
}
return FALSE;
}