读书人

小弟初学API函数有个例子小弟编写后

发布时间: 2012-01-20 18:53:53 作者: rapoo

小弟初学API函数,有个例子小弟编写后无法正常运行,但却找不到错误,请高人指点
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

LRESULT CALLBACK WndProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);

int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // pointer to command line
int nCmdShow // show state of window
)

{
WNDCLASS wc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hInstance=hInstance;
wc.lpfnWndProc=WndProc;
wc.lpszClassName= "wen ";
wc.lpszMenuName=NULL;
wc.style=CS_HREDRAW | CS_VREDRAW;

if(!RegisterClass(&wc))
{
MessageBeep(0);
return FALSE;
}

HWND hwnd;
hwnd=CreateWindow( "wen ", "FOR EXAMPLE THE TEXT

OUT ",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);

MSG msg;
while(GetMessage(&msg,0,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;

}

LRESULT CALLBACK WndProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)

{
HDC hdc;
HFONT hf_black,hf_big;//定义两种字体句柄
PAINTSTRUCT ps;
TEXTMETRIC tm;//定义TEXTMETRIC结构,用于存放字体信息。

char lpsz_1[]= "这是一行红色的、字体为SYSTEM_FONT的文字,红色代表未来。 ";
char lpsz_2[]= "现在显示的是自定义字体,颜色为绿色,绿色代表生机勃勃。 ";
char lpsz_3[]= "现在展现在您面前的是蓝色的粗体字,蓝色代表广阔的海洋和天空。 ";
char lpsz_4[]= "当前的字体为大号,斜体并带有下划线的文字。 ";
char lpsz_5[]= "现在您掌握了字体的操作了吗? ";
char lpsz_6[]= "祝您成功! ";

int X=0,Y=0;

SIZE size;

switch(uMsg)
{
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
SetTextColor(hdc,RGB(255,0,0));
GetTextMetrics(hdc,&tm);//设置缺省字体,写入tm中
TextOut(hdc,X,Y,lpsz_1,strlen(lpsz_1));
//开始进行第二行的输出准备

Y=Y+tm.tmHeight+100*tm.tmExternalLeading;//计算下一行开始的坐标。
hf_black=CreateFont(
20,//字体的高度
0,//由系统设定一个最佳的宽度


0,//文本的倾斜度为0,与页底平行
0,//字体的倾斜度为0
FW_HEAVY,//字体的粗度,此处设置为最粗
0,//非斜体字
0,//无下划线
0,//无中划线,即删除线
ANSI_CHARSET,//表示所用的字符集为ANSI_CHARSET
OUT_DEFAULT_PRECIS,//字体为系统默认的输出精度
CLIP_DEFAULT_PRECIS,//为系统默认的裁剪精度
DEFAULT_QUALITY,// 字体的输出质量为系统默认
DEFAULT_PITCH | FF_DONTCARE,//字体的间距和字体系列均为默认
"粗体字 "
);
SelectObject(hdc,hf_black);
SetTextColor(hdc,RGB(0,255,0));

GetTextMetrics(hdc,&tm);
TextOut(hdc,X,Y,lpsz_2,strlen(lpsz_2));
//开始输出第三行的准备

Y=Y+tm.tmHeight+10*tm.tmExternalLeading;//计算下一行文本的Y坐标
GetTextExtentPoint32(hdc,lpsz_2,strlen(lpsz_2),&size);//获取当前一行字符串的宽度
SetTextColor(hdc,RGB(0,0,255));
TextOut(hdc,X,Y,lpsz_3,strlen(lpsz_3));
//开始输出第四行的准备
X=0;
Y=Y+tm.tmHeight+20*tm.tmExternalLeading;
hf_big=CreateFont(
30,//字体的高度
0,//由系统设定一个最佳的宽度
0,//文本的倾斜度为0,与页底平行
0,//字体的倾斜度为0
FW_NORMAL,//字体的粗度,此处设置为一般租
1,//斜体字
1,//有下划线
0,//无中划线,即删除线
ANSI_CHARSET,//表示所用的字符集为ANSI_CHARSET
OUT_DEFAULT_PRECIS,//字体为系统默认的输出精度
CLIP_DEFAULT_PRECIS,//为系统默认的裁剪精度
DEFAULT_QUALITY,// 字体的输出质量为系统默认
DEFAULT_PITCH | FF_DONTCARE,//字体的间距和字体系列均为默认
"大号字 "
);
SelectObject(hdc,hf_big);
SetTextColor(hdc,RGB(155,155,155));

//GetTextMetrics(hdc,&tm);
TextOut(hdc,X,Y,lpsz_4,strlen(lpsz_4));
//准备输出第五行
SetTextColor(hdc,RGB(255,0,0));
X=0;
Y=Y+tm.tmHeight+30*tm.tmExternalLeading;

TextOut(hdc,X,Y,lpsz_5,strlen(lpsz_5));
//准备输出第五行的后半段

GetTextExtentPoint(hdc,lpsz_5,strlen(lpsz_5),&size);
X=X+size.cx;
TextOut(hdc,X,Y,lpsz_6,strlen(lpsz_6));

EndPaint(hwnd,&ps);
break;
case WM_DESTROY:
DeleteObject(hf_black);
DeleteObject(hf_big);
PostQuitMessage(0);
break;
default:
DefWindowProc(hwnd,uMsg,wParam,lParam);

}
return 0;

}
出现如下告警信息:

Compiling...
fivetext.cpp
e:\vc++6\msdev98\myprojects\fivetext\fivetext.cpp(154) : warning C4700: local variable 'hf_black ' used without having been

initialized
e:\vc++6\msdev98\myprojects\fivetext\fivetext.cpp(155) : warning C4700: local variable 'hf_big ' used without having been

initialized
Linking...

fivetext.exe - 0 error(s), 0 warning(s)

但是窗口无法正常显示,在资源管理器中可以看到这个程序的.exe在运行。

谢谢大家帮助!!

[解决办法]
有这样不负责任的例子?这两个字体在WM_PAINT中创建,在WM_DESTROY消息中销毁?
局部变量在每次进入函数时都要初始化的,也就是说WM_PAINT里的hf_big和WM_DESTROY里的hf_big不是同一个东西。
如果执意用局部变量,应该把创建字体和销毁字体都放到WM_PAINT消息中去,否则hf_black和hf_big要放到外面作为全局变量,在WM_CREATE中创建字体。

读书人网 >VC/MFC

热点推荐