首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

小弟初学API函数,有个例子小弟编写后无法正常运行,但却找不到异常,请高人指点

2012-01-20 
小弟初学API函数,有个例子小弟编写后无法正常运行,但却找不到错误,请高人指点#includewindows.h#include

小弟初学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中创建字体。

热点排行