как распечатать растровое изображение при условии?

0

пожалуйста, помогите мне распечатать растровое изображение при условии. У меня есть две кнопки, созданные как

    case WM_CREATE:
    HWND button1,button2;

    button1= CreateWindow(TEXT("button"), TEXT("button1"),              
             WS_VISIBLE | WS_CHILD | BS_BITMAP|BS_FLAT,
             675, 720, 105, 35,  
             hwnd, (HMENU) pgn, NULL, NULL);
    button2=CreateWindow(TEXT("button"), TEXT("button2"),              
           WS_VISIBLE | WS_CHILD | BS_BITMAP|BS_FLAT,
           675, 720, 105, 35,  
           hwnd, (HMENU) pgn, NULL, NULL);

и два изображения загружены как:

    HBITMAP img1,img2;
    static HINSTANCE g_hInst=NULL;
    img1 = LoadBitmap(g_hInst,"a100");
    img2 = LoadBitmsp(g_hInst,"a101");

Я хочу напечатать img1, когда нажата кнопка 1, и напечатайте img2, когда нажата кнопка2. Я использовал следующий код:

    BITMAP bm;

    case WM_CREATE:
    GetObject(img1, sizeof(bm), &bm);

    case WM_COMMAND:

    switch (wParam)
    {
         case pgn:
         PAINTSTRUCT ps;
         HDC hdcWindow;
         hdcWindow = BeginPaint(hwnd, &ps);
         HDC hdcMemory;
         hdcMemory = CreateCompatibleDC(hdcWindow);


         SelectObject(hdcMemory, img1);
         BitBlt(hdcWindow, 150,25,900, bm.bmHeight, hdcMemory, 0, 0,SRCCOPY);

         DeleteDC(hdcMemory);
         EndPaint(hwnd, &ps);     
         break; 

    case pgp:

    hdcWindow = BeginPaint(hwnd, &ps);
    hdcMemory = CreateCompatibleDC(hdcWindow);


    SelectObject(hdcMemory,img2);
    BitBlt(hdcWindow, 150,25,900, bm.bmHeight, hdcMemory, 0, 0,SRCCOPY);

    DeleteDC(hdcMemory);
    EndPaint(hwnd, &ps); 

но он работает только для первого нажатия кнопки. Я хочу напечатать img1, когда нажата кнопка 1, и напечатайте img2, когда нажата кнопка2. Могу ли я получить более качественный код. Может кто-нибудь мне помочь. Благодарю.

  • 0
    Создайте код, отвечающий за обработку кнопок и действуйте соответственно. Это не особенно сложно, если вы не стремитесь к более общим вещам «n кнопок» или что-то в этом роде.
  • 0
    С каким аспектом у вас возникают проблемы?
Показать ещё 2 комментария
Теги:
winapi

1 ответ

1
Лучший ответ

Имейте переменную, указывающую, какая растровая карта должна отображаться.

HBITMAP hbmpSelected = NULL;

Когда вы нажмете кнопку, измените переменную и вызовите InvalidateRect. Это вызовет отправку вашего цикла сообщений и обработчик WM_PAINT.

// in WM_COMMAND handler
case pgn:
    hbmpSelected = img1;
    InvalidateRect(HWND, NULL);
    break;
case pgp:
    hbmpSelected = img2;
    InvalidateRect(HWND, NULL);
    break;

Поместите весь свой код рисования в обработчик для WM_PAINT. Этот код должен проверить переменную, чтобы решить, какой растровый рисунок выбрать в память DC, прежде чем перевести ее в окно.

case WM_PAINT:
    PAINTSTRUCT ps;
    HDC hdcWindow = BeginPaint(hwnd, &ps);
    if (hbmpSelected != NULL) {
        HDC hdcMemory = CreateCompatibleDC(hdcWindow);
        HGDIOBJ hbmpOld = SelectObject(hdcMemory, hbmpSelected);
        BitBlt(hdcWindow, 150, 25, 900, bm.bmHeight, hdcMemory, 0, 0, SRCCOPY);
        SelectObject(hdcMemory, hbmpOld);
        DeleteDC(hdcMemory);
    }
    EndPaint(hwnd, &ps);
    break;

(В частности, используйте только BeginPaint и EndPaint внутри обработчика WM_PAINT. Есть способы рисовать в вашем окне в других местах, но это только для исключительных обстоятельств, и вы не будете использовать BeginPaint/EndPaint для этой картины.)

(Также не забудьте выбрать свой растровый образ из памяти DC, прежде чем уничтожить память DC. Современные версии GDI склонны терпеть такие ошибки, но лучше всего очистить их напрямую.)

(Также обратите внимание, что ваши кнопки создаются с одинаковым ID, pgn. Я предполагаю, что ошибка транскрипции и вторая должна быть pgp.)

  • 0
    спасибо за вашу помощь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню