请大神帮我看看代码哪里出问题了,运行后没有显示! Win32 SDK编程!

Win32Nerd 2015-02-26 09:58:51
提前感谢!
代码如下:



#include <windows.h>
#include "sysmets.h"
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
{
static TCHAR szAppName[] = TEXT("SysMets With VerticalScrollBar");
MSG message;
HWND hWnd;
WNDCLASS wndcls;

wndcls.cbClsExtra = 0;
wndcls.cbWndExtra = 0;
wndcls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndcls.hCursor = LoadCursor(NULL,IDC_ARROW);
wndcls.hIcon = LoadIcon(NULL,IDI_ERROR);
wndcls.hInstance = hInstance;
wndcls.lpfnWndProc = WndProc;
wndcls.lpszClassName = szAppName;
wndcls.lpszMenuName = NULL;
wndcls.style = CS_VREDRAW | CS_HREDRAW;

if (!RegisterClass(&wndcls))
{
MessageBox(NULL,TEXT("对不起,注册窗口类失败!"),TEXT("错误"),MB_OK | MB_ICONERROR);
return 0;
}

hWnd = CreateWindow(szAppName,
TEXT("Sysmets With VScrollBar"),
WS_OVERLAPPEDWINDOW | WS_VSCROLL,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);

ShowWindow(hWnd,nShowCmd);

UpdateWindow(hWnd);

while(GetMessage(&message,NULL,0,0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
return message.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int cxChar, cxCaps, cyChar, cyClient, iVScrollPos;
HDC hDC;
PAINTSTRUCT ps;
int i, y ;
TCHAR szBuffer[10];
TEXTMETRIC tm;

switch (message)
{
case WM_CREATE:
hDC = GetDC(hwnd);
GetTextMetrics(hDC,&tm);
cxChar = tm.tmAveCharWidth;
cyChar = tm.tmHeight + tm.tmExternalLeading;
cxCaps = (tm.tmPitchAndFamily & 1 ? 3: 2) * cxChar / 2;

ReleaseDC(hwnd,hDC);

SetScrollRange(hwnd,SB_VERT,0,NUMLINES - 1, FALSE);
SetScrollPos(hwnd,SB_VERT,0,TRUE);

return 0;

case WM_SIZE:
cyClient = HIWORD(lParam);

return 0;
case WM_VSCROLL:
switch (LOWORD(wParam))
{
case SB_LINEUP:
iVScrollPos -= 1;
break;
case SB_LINEDOWN:
iVScrollPos += 1;
break;
case SB_PAGEUP:
iVScrollPos -= cyClient / cyChar;
break;

case SB_PAGEDOWN:
iVScrollPos += cyClient / cyChar;
break;

case SB_THUMBPOSITION:
iVScrollPos = HIWORD(wParam);
break;

default:
break;
}
iVScrollPos = max(0,min(iVScrollPos,NUMLINES - 1));

if (iVScrollPos != GetScrollPos(hwnd,SB_VERT))
{
SetScrollPos(hwnd,SB_VERT,iVScrollPos,TRUE);
InvalidateRect(hwnd,NULL,TRUE);
}

return 0;
case WM_PAINT:

hDC = BeginPaint(hwnd,&ps);
for (i = 0; i < NUMLINES; i++)
{
y = cyChar * (i - NUMLINES);
TextOut(hDC,0,y, sysmetrics[i].szLabel,lstrlen(sysmetrics[i].szLabel));
TextOut (hDC, 22 * cxCaps, y,
sysmetrics[i].szDesc,
lstrlen (sysmetrics[i].szDesc)) ;

SetTextAlign (hDC, TA_RIGHT | TA_TOP) ;

TextOut (hDC, 22 * cxCaps + 40 * cxChar, y, szBuffer,
wsprintf (szBuffer, TEXT ("%5d"),
GetSystemMetrics (sysmetrics[i].iIndex))) ;

SetTextAlign (hDC, TA_LEFT | TA_TOP) ;
}
EndPaint (hwnd, &ps) ;
return 0 ;

case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}



我按照网上说的加上#define WINVER 0x0501 也没有显示!
...全文
86 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sandrer 2015-02-26
  • 打赏
  • 举报
回复
y = cyChar * (i - NUMLINES); 这个得出来的纵坐标是负数,所以你的东西都被画到客户端的“上面”去了 试试改成 y = cyChar * i;
worldy 2015-02-26
  • 打赏
  • 举报
回复
显示超出范围了,WM_PAIT改成下面代码试试 case WM_PAINT: hDC = BeginPaint(hwnd,&ps); TextOut(hDC,0,0,"ABC",3); EndPaint (hwnd, &ps) ; case ....
Win32Nerd 2015-02-26
  • 打赏
  • 举报
回复
窗口能显示!但是窗口里面没有显示!!! @ worldy
worldy 2015-02-26
  • 打赏
  • 举报
回复
没显示指什么?没有显示窗口?还是窗口没有显示内容?
Win32Nerd 2015-02-26
  • 打赏
  • 举报
回复
谢谢各位,我把原来的y = cyChar * (i - NUMLINES); 改为 y = cyChar * (i - iVScrollBar) 就可以了!

16,471

社区成员

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

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

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