CHAR 和 WCHAR 的 区别..

ufdxkm ufdxkm 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
#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 怎么会影响到滚动条呢.有人帮我理解下吗. 谢谢!
...全文
评论 6
收藏 已收藏
分享
返回顶部
ufdxkm
VC/MFC 16,550 成员 421,605 内容