Link to home
Start Free TrialLog in
Avatar of Professor
Professor

asked on

button image problem

Guys, I have a serious problem.
I have VC5 and Iam trying to use buttons using CreateWindow() to make them without MFC. I set a new window procedure using SetWindowLong() function. in that window procedure i draw an image onto the button  using a resource file. But for some reason it also draws the same bitmap onto my other button. Can you help me please???
Avatar of AlexVirochovsky
AlexVirochovsky

As I understand, you make button and after this
use ownerdraw mode for Display something.
Next is small example, that makes ~ same (without using rc file).May be it helps you:

#include <windows.h>

#define IDC_SMALLER      1
#define IDC_LARGER       2

#define BTN_WIDTH        (8 * cxChar)
#define BTN_HEIGHT       (4 * cyChar)

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

HINSTANCE hInst ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                PSTR szCmdLine, int iCmdShow)
     {
     static char szAppName[] = "OwnerDrw" ;
     MSG         msg ;
     HWND        hwnd ;
     WNDCLASSEX  wndclass ;

     hInst = hInstance ;

       wndclass.cbSize        = sizeof (wndclass) ;
     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     wndclass.lpszMenuName  = szAppName ;
     wndclass.lpszClassName = szAppName ;
       wndclass.hIconSm       = LoadIcon (NULL, IDI_APPLICATION) ;

     RegisterClassEx (&wndclass) ;

     hwnd = CreateWindow (szAppName, "Owner-Draw Button Demo",
                          WS_OVERLAPPEDWINDOW,
                            CW_USEDEFAULT, CW_USEDEFAULT,
                            CW_USEDEFAULT, CW_USEDEFAULT,
                          NULL, NULL, hInstance, NULL) ;

     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;

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

void Triangle (HDC hdc, POINT pt[])
     {
     SelectObject (hdc, GetStockObject (BLACK_BRUSH)) ;
     Polygon (hdc, pt, 3) ;
     SelectObject (hdc, GetStockObject (WHITE_BRUSH)) ;
     }

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
     {
     static HWND      hwndSmaller, hwndLarger ;
     static int       cxClient, cyClient, cxChar, cyChar ;
     int              cx, cy ;
     LPDRAWITEMSTRUCT pdis ;
     POINT            pt[3] ;
     RECT             rc ;

     switch (iMsg)
          {
          case WM_CREATE :
               cxChar = LOWORD (GetDialogBaseUnits ()) ;
               cyChar = HIWORD (GetDialogBaseUnits ()) ;

                         // Create the owner-draw pushbuttons

               hwndSmaller = CreateWindow ("button", "",
                                  WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
                                  0, 0, BTN_WIDTH, BTN_HEIGHT,
                                  hwnd, (HMENU) IDC_SMALLER, hInst, NULL) ;

               hwndLarger = CreateWindow ("button", "",
                                  WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
                                  0, 0, BTN_WIDTH, BTN_HEIGHT,
                                  hwnd, (HMENU) IDC_LARGER, hInst, NULL) ;
               return 0 ;

          case WM_SIZE :
               cxClient = LOWORD (lParam) ;
               cyClient = HIWORD (lParam) ;

                         // Move the buttons to the new center

               MoveWindow (hwndSmaller, cxClient / 2 - 3 * BTN_WIDTH  / 2,
                                        cyClient / 2 -     BTN_HEIGHT / 2,
                                        BTN_WIDTH, BTN_HEIGHT, TRUE) ;

               MoveWindow (hwndLarger,  cxClient / 2 +     BTN_WIDTH  / 2,
                                        cyClient / 2 -     BTN_HEIGHT / 2,
                                        BTN_WIDTH, BTN_HEIGHT, TRUE) ;
               return 0 ;

          case WM_COMMAND :
               GetWindowRect (hwnd, &rc) ;

                         // Make the window 10% smaller or larger

               switch (wParam)
                    {
                    case IDC_SMALLER :
                         rc.left   += cxClient / 20 ;
                         rc.right  -= cxClient / 20 ;
                         rc.top    += cyClient / 20 ;
                         rc.bottom -= cyClient / 20 ;

                         break ;

                    case IDC_LARGER :
                         rc.left   -= cxClient / 20 ;
                         rc.right  += cxClient / 20 ;
                         rc.top    -= cyClient / 20 ;
                         rc.bottom += cyClient / 20 ;

                         break ;
                    }

               MoveWindow (hwnd, rc.left, rc.top, rc.right  - rc.left,
                                                  rc.bottom - rc.top, TRUE) ;
               return 0 ;

          case WM_DRAWITEM :
               pdis = (LPDRAWITEMSTRUCT) lParam ;

                         // Fill area with white and frame it black

               FillRect (pdis->hDC, &pdis->rcItem,
                         (HBRUSH) GetStockObject (WHITE_BRUSH)) ;

               FrameRect (pdis->hDC, &pdis->rcItem,
                          (HBRUSH) GetStockObject (BLACK_BRUSH)) ;

                         // Draw inward and outward black triangles

               cx = pdis->rcItem.right  - pdis->rcItem.left ;
               cy = pdis->rcItem.bottom - pdis->rcItem.top  ;

               switch (pdis->CtlID)
                    {
                    case IDC_SMALLER :
                         pt[0].x = 3 * cx / 8 ;  pt[0].y = 1 * cy / 8 ;
                         pt[1].x = 5 * cx / 8 ;  pt[1].y = 1 * cy / 8 ;
                         pt[2].x = 4 * cx / 8 ;  pt[2].y = 3 * cy / 8 ;

                         Triangle (pdis->hDC, pt) ;

                         pt[0].x = 7 * cx / 8 ;  pt[0].y = 3 * cy / 8 ;
                         pt[1].x = 7 * cx / 8 ;  pt[1].y = 5 * cy / 8 ;
                         pt[2].x = 5 * cx / 8 ;  pt[2].y = 4 * cy / 8 ;

                         Triangle (pdis->hDC, pt) ;

                         pt[0].x = 5 * cx / 8 ;  pt[0].y = 7 * cy / 8 ;
                         pt[1].x = 3 * cx / 8 ;  pt[1].y = 7 * cy / 8 ;
                         pt[2].x = 4 * cx / 8 ;  pt[2].y = 5 * cy / 8 ;

                         Triangle (pdis->hDC, pt) ;

                         pt[0].x = 1 * cx / 8 ;  pt[0].y = 5 * cy / 8 ;
                         pt[1].x = 1 * cx / 8 ;  pt[1].y = 3 * cy / 8 ;
                         pt[2].x = 3 * cx / 8 ;  pt[2].y = 4 * cy / 8 ;

                         Triangle (pdis->hDC, pt) ;

                         break ;

                    case IDC_LARGER :

                         pt[0].x = 5 * cx / 8 ;  pt[0].y = 3 * cy / 8 ;
                         pt[1].x = 3 * cx / 8 ;  pt[1].y = 3 * cy / 8 ;
                         pt[2].x = 4 * cx / 8 ;  pt[2].y = 1 * cy / 8 ;

                         Triangle (pdis->hDC, pt) ;

                         pt[0].x = 5 * cx / 8 ;  pt[0].y = 5 * cy / 8 ;
                         pt[1].x = 5 * cx / 8 ;  pt[1].y = 3 * cy / 8 ;
                         pt[2].x = 7 * cx / 8 ;  pt[2].y = 4 * cy / 8 ;

                         Triangle (pdis->hDC, pt) ;

                         pt[0].x = 3 * cx / 8 ;  pt[0].y = 5 * cy / 8 ;
                         pt[1].x = 5 * cx / 8 ;  pt[1].y = 5 * cy / 8 ;
                         pt[2].x = 4 * cx / 8 ;  pt[2].y = 7 * cy / 8 ;

                         Triangle (pdis->hDC, pt) ;

                         pt[0].x = 3 * cx / 8 ;  pt[0].y = 3 * cy / 8 ;
                         pt[1].x = 3 * cx / 8 ;  pt[1].y = 5 * cy / 8 ;
                         pt[2].x = 1 * cx / 8 ;  pt[2].y = 4 * cy / 8 ;

                         Triangle (pdis->hDC, pt) ;

                         break ;
                    }

                         // Invert the rectangle if the button is selected

               if (pdis->itemState & ODS_SELECTED)
                    InvertRect (pdis->hDC, &pdis->rcItem) ;

                         // Draw a focus rectangle if the button has the focus

               if (pdis->itemState & ODS_FOCUS)
                    {
                    pdis->rcItem.left   += cx / 16 ;
                    pdis->rcItem.top    += cy / 16 ;
                    pdis->rcItem.right  -= cx / 16 ;
                    pdis->rcItem.bottom -= cy / 16 ;

                    DrawFocusRect (pdis->hDC, &pdis->rcItem) ;
                    }

               return 0 ;

          case WM_DESTROY :
               PostQuitMessage (0) ;
               return 0 ;
          }
     return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
     }
Avatar of DanRollins
The simplest solution is to add the BS_BITMAP style when you create the window, and then send it a BM_SETIMAGE message:

HWND hwndBmp= CreateWindow("BUTTON",..... WS_CHILD|BS_BITMAP,...);

HBITMAP hBmp= LoadBitmap( hInst, MAKEINTRESOURCE(IDB_BITMAP1) );

SendMessage( hwndBtn, BM_SETIMAGE, IMAGE_BITMAP, hbmpTheBitmap);

-- Dan
for Professor,
Do you have any additional questions?  Do any comments need clarifiacation?

-- Dan
Professor, I don't know, helps my comment or not, but
you don't react and minimum I 've sent you working
code. Alex
This question was LOCKED with a PROPOSED ANSWER and awaits your decision today.  Once a question is LOCKED with a Proposed Answer, few new experts will step in to help on that question, since the assumption is, you've been helped.  If the Proposed Answer helped you, please accept it and award that expert.  If it did not help you, please reject it and add comments as to status and what else is needed.

If you wish to award multiple experts, just comment here with detail, I'll respond as soon as possible.  As it stands today, you asked the question, got help and not one expert was awarded for the contribution(s) made.  Your response is needed.  I'll monitor through month end, and if you've not returned to complete this, we'll need to decide.  Expert input is welcome (as always) to determine the outcome here if the Asker does not respond.

Your response in finalizing this (and ALL) your question(s) is appreciated.

Site-related HELP:  https://www.experts-exchange.com/jsp/cmtyHelpDesk.jsp
Moondancer
Community Support Moderator @ Experts Exchange
Avatar of Professor

ASKER

Well, I cant get how that stuff worx...

Thanx anywayz
Hi, Professor, just comment here as to what you'd like done with this question.  If an expert or more than one helped you here, advise detail and I'll help split points or whatever you need.  

Thanks,

Moondancer
Community Support Moderator @ Experts Exchange
With which part of my simple solution do you need help? Do you need to know how to set a style flag for a button?  To you need to know how to load a bitmap resource?  

If you really want to solve your problem, you will need to communicate.  Also, you will find that posting some of your code will often get things moving.  When experts have a concrete example, they can get results faster.

-- Dan
ASKER CERTIFIED SOLUTION
Avatar of DanRollins
DanRollins
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Sorry, I will try the code again with VC 6 instead of the Borland C.
hi Professor,
Do you have any additional questions?  Do any comments need clarifiacation?

-- Dan
Comment from DanRollins accepted as answer.

Thank you
Computer101
Community Support Moderator