Win32输出汉字

jinye_kim 2009-05-11 01:04:14
Win32 如创建了一窗口,怎么样才能够在这个窗口上面输出一段汉字,具体假设每隔50毫秒输出这段汉字的其中一个字,直到循环将这段汉字输出完毕。
有什么好的做法吗?如果可能,用代码或伪代码实现下,谢谢!
...全文
126 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
make026 2009-05-11
  • 打赏
  • 举报
回复

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);

HFONT MyCreateFont(int, DWORD, LPCTSTR);

char szClassName[] = "font01"; //窗口类


int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
LPSTR lpsCmdLine, int nCmdShow)
{
MSG msg;
BOOL bRet;

if (!InitApp(hCurInst))
return FALSE;
if (!InitInstance(hCurInst, nCmdShow))
return FALSE;
while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
if (bRet == -1) {
break;
} else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}

//登录窗口类

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 = (HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hCursor = (HCURSOR)LoadImage(NULL,
MAKEINTRESOURCE(IDC_ARROW),
IMAGE_CURSOR,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL; //菜单名
wc.lpszClassName = (LPCSTR)szClassName;
wc.hIconSm = (HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);

return (RegisterClassEx(&wc));
}

//产生窗口

BOOL InitInstance(HINSTANCE hInst, int nCmdShow)
{
HWND hWnd;

hWnd = CreateWindow(szClassName,
"汉字Font", //标题
WS_OVERLAPPEDWINDOW, //窗口类
CW_USEDEFAULT, //X axis
CW_USEDEFAULT, //Y axis
CW_USEDEFAULT, //宽
CW_USEDEFAULT, //高
NULL, //母窗口码,当这个窗口就是母窗口时设为NULL
NULL, ///功能码,要使用类型的菜单时设定为NULL
hInst, //实体码
NULL);

if (!hWnd)
return FALSE;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}

//窗口 function

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
int id;
static HFONT hFont1, hFont2, hFont3;
PAINTSTRUCT ps;
HDC hdc;
char *szName[] = {"我","爱","你"}; // 你要一段什么汉字?
int x,y;
int fSize = 40; //font size

switch (msg) {
case WM_CREATE:
hFont1 = MyCreateFont(fSize, CHINESEBIG5_CHARSET, "新细明体"); //font
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
SelectObject(hdc, hFont1);
int i;
for(i=0; i<3; i++){
x = 100 + i*fSize; //汉字出现的x axis, 为了避免汉字重迭所以要 + i*fSize
y = 100; //汉字出现的y axis
TextOut(hdc, x, y, (LPCTSTR)szName[i], (int)strlen(szName[i]));
Sleep(50); //文字间隔时间
}

for(i=0; i<3; i++){
x = 100;
y = 200 + i*fSize;
TextOut(hdc, x, y, (LPCTSTR)szName[i], (int)strlen(szName[i]));
Sleep(50);
}

EndPaint(hWnd, &ps);
break;
case WM_CLOSE:
id = MessageBox(hWnd, "退出程序", "确认",
MB_YESNO | MB_ICONQUESTION);
if (id == IDYES) {
DeleteObject(hFont1);
DeleteObject(hFont2);
DestroyWindow(hWnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0;
}

HFONT MyCreateFont(int nHeight, DWORD dwCharSet, LPCTSTR lpName)
{
return( CreateFont(nHeight, 0, 0, 0,
FW_DONTCARE,
FALSE, FALSE, FALSE,
dwCharSet,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH | FF_DONTCARE,
lpName));
}
fairchild811 2009-05-11
  • 打赏
  • 举报
回复
settimer和textout
ltc_mouse 2009-05-11
  • 打赏
  • 举报
回复
TextOut有个参数取字符串的字符个数,配合SetTimer就能逐字显示了,以下代码参考:

static const wchar_t *g_wzText = L"测试汉字逐字显示问题,使用SetTimer每隔50ms显示一个字符";
static int g_uCurDispNum; //当前显示字符数
static int g_uTotalChars; //字符串字符总数
#define IDT_TEXTSHOW 0x1001
LRESULT CALLBACK WinProc( HWND hwnd,UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_CREATE:
g_uCurDispNum = 1;
g_uTotalChars = (int)wcslen(g_wzText);
SetTimer(hwnd, IDT_TEXTSHOW, 50, NULL);
break;
case WM_TIMER:
if( IDT_TEXTSHOW == wParam )
{
InvalidateRect(hwnd, NULL, FALSE);
if( ++ g_uCurDispNum >= g_uTotalChars )
{
KillTimer(hwnd, IDT_TEXTSHOW);
}
}
break;
case WM_PAINT:
{
RECT r;
PAINTSTRUCT ps;
HDC hdc=BeginPaint(hwnd,&ps);
GetClientRect(hwnd, &r);
TextOutW(hdc, r.left+50, r.top+50, g_wzText, g_uCurDispNum);
EndPaint(hwnd,&ps);
}
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
liliangbao 2009-05-11
  • 打赏
  • 举报
回复
帮顶!!!
老邓 2009-05-11
  • 打赏
  • 举报
回复
楼主看《Windows程序设计》
有电子版。
前三章就搞定了。
elmnd 2009-05-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hairetz 的回复:]
引用楼主 jinye_kim 的帖子:
Win32 如创建了一窗口,怎么样才能够在这个窗口上面输出一段汉字,具体假设每隔50毫秒输出这段汉字的其中一个字,直到循环将这段汉字输出完毕。
有什么好的做法吗?如果可能,用代码或伪代码实现下,谢谢!


很复杂吗?定时输出就可以了啊。
[/Quote]
在TIMER事件里面, 如果字符串不是到结尾, 输出字符串, KO!
1900_in_bj 2009-05-11
  • 打赏
  • 举报
回复
把文字缓存和文字显示用不同的字符串表示
在OnDraw事件处理中用TextOut写文字显示字符串。
启动50毫秒的TIMER在窗口WM_TIMER事件中更改文字显示字符串内容,每次增加一个字,并强制重画窗口。
光宇广贞 2009-05-11
  • 打赏
  • 举报
回复
伪代码?只想要伪代码的话可是太好弄了。

procedure 每隔50ms输出一个汉字直到完
param : KanJiList
begin
for i = 1 : 1 : Count(KanJiList)
begin
在窗口上输出一个汉字
Sleep(50);
end for
end procedure
  • 打赏
  • 举报
回复
[Quote=引用楼主 jinye_kim 的帖子:]
Win32 如创建了一窗口,怎么样才能够在这个窗口上面输出一段汉字,具体假设每隔50毫秒输出这段汉字的其中一个字,直到循环将这段汉字输出完毕。
有什么好的做法吗?如果可能,用代码或伪代码实现下,谢谢!
[/Quote]

很复杂吗?定时输出就可以了啊。

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧