We will now let the user choose which color to use when drawing.
To do that we modify the toolbar so the user can select color by pressing a button on it.
The original toolbar used system default images, but we can't use them here, so we start of by creating a bitmap file:
The size of each part must be 16 by 16 pixels, the image contains 5 images, and is thus 80 pixels wide.
When we create the Toolbar we must first create a bitmap-handle from the image file:
HBITMAP ToolBarBitmap = (HBITMAP )LoadImage(0, "toolbar.bmp", IMAGE_BITMAP, 80, 16, LR_LOADFROMFILE);We then tell the toolbar to use this bitmap-handle:
TBADDBITMAP TBaddBitmap; TBaddBitmap.hInst = 0; TBaddBitmap.nID = (UINT )ToolBarBitmap; SendMessage(ToolBarWindow, TB_ADDBITMAP, (WPARAM )NumButton, (LPARAM )&TBaddBitmap);We have tree colors, but only one can be active at a time, so we will let a button stay pushed until the user push another button in the same group. To do that we create the buttons with the TBSTYLE_CHECKGROUP style and not TBSTYLE_BUTTON. The default should have the TBSTATE_CHECKED state set, to indicate that it is selected.
If red is default we could create its button with:
idx = SendMessage(ToolBarWindow, TB_ADDSTRING, 0, (LPARAM )"Red"); ButtonInfo[4].iString = idx; ButtonInfo[4].iBitmap = 2; ButtonInfo[4].idCommand = DrawRedCmd; ButtonInfo[4].fsState = TBSTATE_ENABLED | TBSTATE_CHECKED; ButtonInfo[4].fsStyle = TBSTYLE_CHECKGROUP;ButtonInfo[].iBitmap is the index into the bitmap, that is, the square starting at 16*index.
The other buttons are created the same way, they just does not have the TBSTATE_CHECKED state.
We will then add handlers for the tree buttons, in the windows proc:
case DrawRedCmd: CurrentColor = RGB(255, 0, 0); break; case DrawBlueCmd: CurrentColor = RGB(0, 0, 255); break; case DrawGreenCmd: CurrentColor = RGB(0, 255, 0); break;We will set the color for the line class in it's constructor, the LineClass will then look like this:
class LineClass { public: LineClass(POINT aStart, COLORREF aColor) : Start(aStart), End(aStart), Color(aColor), First(true) {} void SetEnd(HDC &aDc, POINT aEnd) { Draw(aDc, true); End = aEnd; Draw(aDc, true); } void Draw(HDC &dc, bool aMoving = false); private: POINT Start; POINT End; COLORREF Color; bool First; };The Draw function must then create the pen in the correct color.
The complete code for the application can be found here