CHAR 和 WCHAR 的 区别..

ufdxkm 2009-08-16 03:49:03
#include <windows.h>


LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

HINSTANCE hInst;

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,
int iCmdShow)
{

MSG msg;
HWND hwnd;

WNDCLASS wc;


wc.lpszClassName = TEXT("GenericAppClass");
wc.lpfnWndProc = WndProc;
wc.style = CS_VREDRAW | CS_HREDRAW;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = (HBRUSH)( COLOR_WINDOW+1 );
wc.lpszMenuName = TEXT("GenericAppMenu");
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;

if(! RegisterClass( &wc ))
{
MessageBox(NULL,TEXT("必须运行在Windows NT 系统下!"),TEXT("错误"),MB_OK);
return 0;
}

hwnd = CreateWindow( TEXT("GenericAppClass"),
TEXT("Generic Application"),
WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN,
CW_USEDEFAULT,
CW_USEDEFAULT,
300,
400,
NULL,
NULL,
hInstance,
NULL
);

ShowWindow( hwnd, iCmdShow);

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

return (int)msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam ,LPARAM lParam)
{

static HGLOBAL hResource;
static char *pText; //这个声明为WCHAR 的话. 滚动条就不能用了.
HDC hdc;
PAINTSTRUCT ps;
static int iNumLines,ivos;
TEXTMETRIC tm;
static int cxChar,cyChar,cxClient,cyClient,xScroll;
RECT rect;
static HWND hScroll;


switch(message)
{



case WM_CREATE:

hdc = GetDC (hwnd) ;
GetTextMetrics (hdc, &tm) ;
cxChar = tm.tmAveCharWidth ;
cyChar = tm.tmHeight + tm.tmExternalLeading ;
ReleaseDC (hwnd, hdc) ;

xScroll = GetSystemMetrics (SM_CXVSCROLL) ;

hScroll = CreateWindow (TEXT ("scrollbar"), NULL,
WS_CHILD | WS_VISIBLE | SBS_VERT,
0, 0, 0, 0,
hwnd, (HMENU) 1, hInst, NULL) ;


SetScrollRange (hScroll, SB_CTL, 0, 100, FALSE) ;
SetScrollPos (hScroll, SB_CTL, 0, FALSE) ;
return 0 ;


case WM_SIZE:


MoveWindow (hScroll, LOWORD (lParam) - xScroll, 0,
xScroll, cyClient = HIWORD (lParam), TRUE) ;
SetFocus (hwnd) ;
return 0 ;



case WM_PAINT :
hdc = BeginPaint (hwnd, &ps) ;


GetClientRect (hwnd, &rect) ;
rect.left += cxChar ;
rect.top += cyChar * (1 - ivos) ;
DrawTextA (hdc, TEXT("test...............\
.........................\
...........................\
......................\
.........................\
............."), -1, &rect, DT_EXTERNALLEADING) ;

EndPaint (hwnd, &ps) ;
return 0 ;


case WM_VSCROLL :
switch (wParam)
{
case SB_TOP :
ivos = 0 ;
break ;
case SB_BOTTOM :
ivos = 100 ;
break ;
case SB_LINEUP :
ivos -= 1 ;
break ;
case SB_LINEDOWN :
ivos += 1 ;
break ;
case SB_PAGEUP :
ivos -= cyClient / cyChar ;
break ;
case SB_PAGEDOWN :
ivos += cyClient / cyChar ;
break ;
case SB_THUMBPOSITION :
ivos = LOWORD (lParam) ;
break ;
}
ivos = max (0, min (ivos, 100)) ;

if (ivos != GetScrollPos (hScroll, SB_CTL))
{
SetScrollPos (hScroll, SB_CTL, ivos, TRUE) ;
InvalidateRect (hwnd, NULL, TRUE) ;
}
return 0 ;

case WM_DESTROY:
PostQuitMessage(0);
return 0;

}

return DefWindowProc(hwnd,message,wParam,lParam);
}






我简化成了一个可以直接编译的代码.. WCHAR 和 CHAR 怎么会影响到滚动条呢.有人帮我理解下吗. 谢谢!
...全文
367 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
healer_kx 2009-08-16
  • 打赏
  • 举报
回复
sizeof(char)
sizeof(WCHAR)
试一试呗~
ufdxkm 2009-08-16
  • 打赏
  • 举报
回复
我的问题是 WCHAR 的时候. 滚动条不能用了. 但是现在可以了...
  • 打赏
  • 举报
回复
W----unicode
A----ANSI
ufdxkm 2009-08-16
  • 打赏
  • 举报
回复
刚刚重新打开了下IDE又可以了...晕啊.
用户 昵称 2009-08-16
  • 打赏
  • 举报
回复
char是8个bit,wchar是16个bit。
I_NBFA 2009-08-16
  • 打赏
  • 举报
回复
能滚动啊, 我这可以.
WCHAR是宽字节, 每个字符2字节, char是1字节.

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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