Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Помогите сделать переключатель


Автор: FiZZzer 14.1.2010, 21:06
Надо чтобы при выборе Карандаш в меню происходило переключение в WM_COMMAND, и можно было рисовать карандашом(ID_Pencil)
Код

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    static HDC hDC;
    static int x, y;  // позиция курсора мыши
    static BOOL bTracking = FALSE;

    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Разобрать выбор в меню:
        switch (wmId)
        {
        case ID_Pencil:
            switch(message)
            {
            case WM_LBUTTONDOWN: 
        bTracking = TRUE;
        // начальная позиция
        x = LOWORD(lParam);
        y = HIWORD(lParam);
        MoveToEx(hDC, x, y, NULL);
        break; 
 
        case WM_LBUTTONUP:
        if (bTracking)
            bTracking = FALSE; 
            break; 
 
        case WM_MOUSEMOVE: 
        if (bTracking) {
            // новая позиция
            x = LOWORD(lParam);
            y = HIWORD(lParam);
            LineTo(hDC, x, y);
        } 
            break;
            }

        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO: добавьте любой код отрисовки...
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

Автор: mekhanikus 16.1.2010, 03:54
Код

case WM_LBUTTONDOWN: 
case WM_LBUTTONUP:
case WM_MOUSEMOVE: 

Надо обрабатывать в первичном switch(message)
case ID_Pencil:
Придет однократно, при нажатии пункта меню.
При этом надо выставить какой-нибудь флаг разрешения рисования.
В WM_MOUSEMOVE проверять этот флаг и отрисовывать перемещения мыши в отдельном контексте.
Затем в WM_PAINT делать BitBlt в контекст экрана.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)