回 帖 发 新 帖 刷新版面

主题:Link............Why???????????????

程序目的:在窗口中使用定时器,每隔1秒,交替用红色,绿色和连色的画刷来填充整个窗口客户区
请帮忙分析一下我的程序:
程序总是停在Link....
Compiling...
Timer.cpp
Linking...

Timer.exe - 0 error(s), 0 warning(s)

#include<windows.h>
#define ID_TIMER 1
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszCmdLine,int nCmdShow)
{
    static char szAppName[]="Timer1";
    HWND hWnd;
    MSG msg;
    WNDCLASS WndClass;
    WndClass.cbClsExtra =0;
    WndClass.cbWndExtra =0;
    WndClass.hbrBackground =(HBRUSH)(GetStockObject(WHITE_BRUSH));
    WndClass.hCursor =LoadCursor(NULL,IDC_ARROW);
    WndClass.hIcon =LoadIcon(NULL,IDI_APPLICATION);
    WndClass.lpfnWndProc =WndProc;
    WndClass.hInstance =hInstance;
    WndClass.lpszClassName =NULL;
    WndClass.lpszMenuName =szAppName;
    WndClass.style =CS_HREDRAW|CS_VREDRAW;
    RegisterClass(&WndClass);


hWnd=CreateWindow(szAppName,
                  "Timer1 Demo Program",
                  WS_OVERLAPPEDWINDOW,
                  CW_USEDEFAULT,
                  CW_USEDEFAULT,
                  CW_USEDEFAULT,
                  CW_USEDEFAULT,
                  NULL,
                  NULL,
                  hInstance,
                  NULL);
while(!SetTimer(hWnd,ID_TIMER,1000,NULL))

    if(IDCANCEL==MessageBox(hWnd,
        "Too many clocks or timers!",szAppName,
        MB_ICONEXCLAMATION|MB_RETRYCANCEL))
        return FALSE;
    ShowWindow(hWnd,nCmdShow);
    UpdateWindow(hWnd);

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

LRESULT CALLBACK WndProc(HWND hWnd,UINT Message,WPARAM wParam,LPARAM lParam)
{
    static int colors=0;
    HBRUSH hBrush;
    HDC hDC;
    PAINTSTRUCT ps;
    RECT rect;
    switch(Message)
    {
    case WM_TIMER:
        MessageBeep(-1);
        InvalidateRect(hWnd,NULL,FALSE);
        return 0;
    case WM_PAINT:
        hDC=BeginPaint(hWnd,&ps);
        GetClientRect(hWnd,&rect);
        switch(colors)
        {
        case 0:
            hBrush=CreateSolidBrush(RGB(255,0,0));
            colors++;
            break;
        case 1:
            hBrush=CreateSolidBrush(RGB(0,255,0));
            colors++;
            break;
        case 2:
            hBrush=CreateSolidBrush(RGB(0,0,255));
            colors=0;
        }
        FillRect(hDC,&rect,hBrush);
        EndPaint(hWnd,&ps);
        DeleteObject(hBrush);
        return 0;
    case WM_DESTROY:
        KillTimer(hWnd,ID_TIMER);
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hWnd,Message,wParam,lParam);
}

回复列表 (共1个回复)

沙发

请将while(!SetTimer(hWnd,ID_TIMER,1000,NULL))语句改成
if(!SetTimer(hWnd,ID_TIMER,1000,NULL))
  SetTimer(hWnd,ID_TIMER,1000,NULL);
试试。根据你的程序代码,定时器函数启动一次就行。而while语句可能造成死循环。

我来回复

您尚未登录,请登录后再回复。点此登录或注册