win32 메뉴에 타이머함수를 넣었는데 작동을 하지 않습니다.

조회수 484회
#include"resource1.h"
#include <windows.h>
#include<iostream>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
HBITMAP hBmpAir, hBmpBack;

HINSTANCE hInst;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
int nShowCmd)
{
HWND hWnd;
MSG mSg;
char szTitle[] = "My First Airplane Game";
char szClass[] = "Class";

hInst = hInstance;
WNDCLASSEX WndEx;
WndEx.cbSize = sizeof(WndEx);
WndEx.style = NULL;
WndEx.lpfnWndProc = WndProc;
WndEx.cbClsExtra = 0;
WndEx.cbWndExtra = 0;
WndEx.hInstance = hInstance;
WndEx.hIcon = LoadIcon(NULL, "");
WndEx.hCursor = LoadCursor(NULL, IDC_ARROW);
WndEx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
WndEx.lpszMenuName = "IDR_MENU";
WndEx.lpszClassName = szClass;
WndEx.hIconSm = LoadIcon(hInstance, "");
RegisterClassEx(&WndEx);
hWnd = CreateWindowEx(NULL, szClass, szTitle,
    WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
    320 * 2, 240 * 2, NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, nShowCmd);
UpdateWindow(hWnd);

hBmpAir = LoadBitmap(hInstance, "IDB_Air");
hBmpBack = LoadBitmap(hInstance, "IDB_Back");


while (TRUE)
{
    if (PeekMessage(&mSg, NULL, 0, 0, PM_NOREMOVE))
    {
        if (!GetMessage(&mSg, NULL, 0, 0))
            break;
        TranslateMessage(&mSg);
        DispatchMessage(&mSg);
    }
}
return mSg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
char szText[100];
HPEN hPen;
PAINTSTRUCT ps;

static POINT pOint;
static BOOL bSw = TRUE;
static HWND hButtStart, hButtExit, hButtStop;
HDC hDC, hMemDC, hMemDC1;
static int aX = 0, aY = 0;
static int bX = 0, bY = 321;

switch (uMsg)
{

case WM_COMMAND:
    switch (LOWORD(wParam)) {
    case ID_ACTION_START:
        SetTimer(hWnd, 1, 100, NULL);
        break;
    case ID_ACTION_STOP:
        KillTimer(hWnd, 1);
        break;

    }
    return FALSE;




case WM_TIMER:
    aX = aX + 5;
    if (aX < 0)aX = 640;
    InvalidateRect(hWnd, NULL, TRUE);
    UpdateWindow(hWnd);
    bX -= 2;
    if (bX > 640)bX = 0;

    return FALSE;


case WM_KEYDOWN:
    switch (LOWORD(wParam))
    {
    case VK_UP:
        aY = aY - 5; //aY-=3;
        if (aY < 0)aY = 480;
        InvalidateRect(hWnd, NULL, TRUE);
        UpdateWindow(hWnd);
        break;
    case VK_DOWN:
        aY = aY + 5;
        if (aY > 480)aY = 0;
        InvalidateRect(hWnd, NULL, TRUE);
        UpdateWindow(hWnd);
        break;
    case VK_LEFT:
        aX = aX - 5;
        if (aX < 0)aX = 640;
        InvalidateRect(hWnd, NULL, TRUE);
        UpdateWindow(hWnd);
        bX += 2;
        if (bX > 640)bX = 0;
        break;
    case VK_RIGHT:
        aX = aX + 5;
        if (aX > 640)aX = 0;
        InvalidateRect(hWnd, NULL, TRUE);
        UpdateWindow(hWnd);
        bX -= 2;
        if (bX < 0)bX = 640;
        break;
    }


    return FALSE;

case WM_PAINT:

    hDC = GetDC(hWnd);
    hMemDC = CreateCompatibleDC(hDC);

    SelectObject(hMemDC, hBmpAir);
    BitBlt(hDC, aX, aY, 127, 37, hMemDC, 0, 0, SRCCOPY);

    SelectObject(hMemDC, hBmpBack);
    BitBlt(hDC, bX, bY, 640, 150, hMemDC, 0, 0, SRCCOPY);
    BitBlt(hDC, bX - 640, bY, 640, 150, hMemDC, 0, 0, SRCCOPY);

    ReleaseDC(hWnd, hDC);
    DeleteDC(hMemDC);


    return FALSE;


case WM_DESTROY:
    PostQuitMessage(0);
    return FALSE;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

전체 코드를 올립니다. 이런식으로 작성을 했는데 메뉴에서 Start를 눌러봐도 작동을 하지 않습니다. 뭐가 문제인지 잘 모르겠습니다. 빌드가 실패하지는 않는데 타이머는 작동을 안하네요...

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 코드 일부만 제공된 상태에서 알수가 없습니다. 그리고 디버거가 있는데...우선 SetTimer 에 의해 WM_TIMER 메세지부터 발생하는지 보세요. 제 생각엔 WM_COMMAND 메세지부터 디버깅을 해보셨으면 합니다. 정영훈 2019.5.27 11:30
  • 답변 감사합니다. 전체 코드를 올렸는데 혹시 한번 봐주실수 있을까요?? 알 수 없는 사용자 2019.5.27 12:14
  • 제가 윈도우가 아니라서...당장은 어렵습니다. HWND hButtStart, hButtExit, hButtStop; 이것들이 컨트롤용 핸들 같은데...실제 컨트롤을 생성하는 부분은 어디있나요? 정영훈 2019.5.27 12:28

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)