swoja bitmapa na buttonie

0

Witam!

Jestem początkujący więc proszę o wyrozumiałość. Mam następujące pytanie, jak zrobić aby button nie wyglądał standardowo tylko aby odpalała się moja bitmapa jako button? Być może było dużo takich tematów ale żaden nie pomógł mi zrozumieć jak to zrobić. :-| Pozdrawiam

0

Pytanie w czym programujesz?
Poszukaj: ownerdraw button

0

Wiem że to forum do pomocy a nie do pisania gotowców ale czy mógłbym prosić o kod który by rysował na buttonie mój obrazek?.

0

primo: C++/WINAPI, C++/MFC, C++/ATL, C++/QT, C++/CLI czy w czymże piszesz??
zakladam, ze CLI.

secundo: Nie no, kurde, nie przeginajmy, nie zawsze trzeba od razu ownerdraw. Jesli tylko chcesz miec klikalny element na formatce ktory wyglada jak obrazel, postaw sobie PictureBoxa (->obrazek), zaladuj go owa bitmapa, i podepnij sie w pictureboxowe CLICK event. Et voila, masz niby-button. Czy tez potrzebujesz doslownie BUTTONa z jakiego powodu?

tertio: aby narysowac NA kontrolce cokolwiek, albo wlacz jej ownerdraw i obsluz, albo wepnij sie w jej PAINT event. Jak sie odpali, dostaniesz na chwile jej obiekt graphics ktorym mozesz sobie po niej rysowac dowoli.

0

Błędne założenie. Ja piszę w C++/WINAPI

0

to dowolna bitmapa, czy z zasobow? resources -> moze BS_BITMAP, BM_SETIMAGE Ci wystarczy

jesli nie, to wlacz buttonowi BS_OWNERDRAW +WM_DRAWITEM..
http://www.codeproject.com/KB/buttons/odib.aspx
http://www.codeguru.com/cpp/controls/buttonctrl/advancedbuttons/article.php/c5161
itp

0

Jest to dowolna bitmapa. :-O

0

Mam taki kod i.......
1.Jak zastosować tam to co napisałeś
2.Dlaczego nie działa mi wyświetlanie bitmapy

O to kod:

#include <windows.h>
#include "Projekt1.h"

HBITMAP moj_obraz;
BITMAP bm;

/* Declare Windows procedure */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/* Make the class name into a global variable */
char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)

{
HWND hwnd; /* This is the handle for our window /
MSG messages; /
Here messages to the application are saved /
WNDCLASSEX wincl; /
Data structure for the windowclass */

/* The Window structure */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
wincl.cbSize = sizeof (WNDCLASSEX);

/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;                 /* No menu */
wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
wincl.cbWndExtra = 0;                      /* structure or the window instance */
/* Use Windows's default color as the background of the window */
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

/* Register the window class, and if it fails quit the program */
if (!RegisterClassEx (&wincl))
    return 0;

/* The class is registered, let's create the program*/
hwnd = CreateWindowEx (
       0,                   /* Extended possibilites for variation */
       szClassName,         /* Classname */
       "Program17",       /* Title Text */
       WS_OVERLAPPEDWINDOW, /* default window */
       CW_USEDEFAULT,       /* Windows decides the position */
       CW_USEDEFAULT,       /* where the window ends up on the screen */
       608,                 /* The programs width */
       384,                 /* and height in pixels */
       HWND_DESKTOP,        /* The window is a child-window to desktop */
       NULL,                /* No menu */
       hThisInstance,       /* Program Instance handler */
       NULL                 /* No Window Creation data */
       );

/* Make the window visible on the screen */
ShowWindow (hwnd, nFunsterStil);

/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0))
{
    /* Translate virtual-key messages into character messages */
    TranslateMessage(&messages);
    /* Send message to WindowProcedure */
    DispatchMessage(&messages);
}

/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;

}

/* This function is called by the Windows function DispatchMessage() */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc, hdc_bitmapy;
RECT wsp;

{

switch (message) /* handle the messages */
{

    case WM_CREATE:
        static HINSTANCE hInst = (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE);
        
        static HWND hWndButton1 = CreateWindowEx(
        0, 
        "BUTTON", 
        "Rozpocznij Grę", 
        WS_CHILD | WS_VISIBLE, 
        445, 
        40, 
        150, 
        35, 
        hwnd, 
        (HMENU) 101,
        hInst, 
        NULL);
        
        static HWND hWndButton2 = CreateWindowEx(
        0, 
         "BUTTON", 
        "Koniec", 
        WS_VISIBLE | WS_CHILD, 
        445, 
        80, 
        150, 
        35, 
        hwnd, 
        (HMENU) 102, 
        hInst, 
        NULL); 	
        break;            
    case WM_COMMAND: 
        switch(LOWORD(wParam))
        {
            case 101:
                MessageBoxA(hwnd, "Akcja przycisku numer 1", "Akcja:", 0);
                break;
            case 102:
				SendMessage(hwnd, WM_DESTROY, 0, 0);					
                break;
        } 
        break;                
    case WM_DESTROY:
        PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
        break;
    default:                      /* for messages that we don't deal with */
        return DefWindowProc (hwnd, message, wParam, lParam);
   

 }

return 0;

}
}

0

REPOF

0

REPOF?

nie dziala Ci wyswietlanie bitmapy z dwoch powodow:

  • powyzszy kod sie nie kompiluje, gdyz masz uszkodzonego switch/case. jesli Ci sie kompiluje, to masz kompilator niezgodny z C++. a moze piszesz w C?
  • bitmapa nie ma sie jak wyswietlic, poniewaz poza utworzeniem paru zmiennych, nie masz nigdzie zadnego kodu ladujacego ja ani nawet.. rysujacego czy podajacego ja dalej do kontrolki itp

podalem Ci dwa dobre linki. przeczytales je?
pierwszy prowadzi za łapkę, jak zaimplementowac ownerdraw dla przycisku.

kompletna podstawa zeby jakkolwiek zaczac, to:
do swojego wndproca dodac case WM_DRAWITEM
poza WS_CHILD itp dodac buttonowi flage stylu BS_OWNERDRAW
dzieki temu stylowi buttona, ten case sie odpali w momencie gdy system stwierdzi ze teraz Twoj owner-drawn-button ma zostac odrysowany

a u Ciebie nawet po tym ani widu ani slychu.. IMHO, nie przeczytales.

1 użytkowników online, w tym zalogowanych: 0, gości: 1