| 
  • If you are citizen of an European Union member nation, you may not use this service unless you are at least 16 years old.

  • You already know Dokkio is an AI-powered assistant to organize & manage your digital files & messages. Very soon, Dokkio will support Outlook as well as One Drive. Check it out today!

View
 

WinApi - ToolBar Common Control

Page history last edited by Ramachandran 16 years, 1 month ago

 //API functions used: CreateWindowEx,DefWindowProc,DispatchMessage,GetMessage,

//GetSystemMetrics,GetWindowLongPtr,InitCommonControlsEx,LoadImage,MessageBox,

//MoveWindow,PostQuitMessage,RegisterClassEx,SendMessage,SetWindowLongPtr,

//ShowWindow,UpdateWindow,TranslateMessage,WinMain.

//=============================================================================

//This demonstrates the creation of a toolbar common control.

//

//BCC55 - Link with comctl32.lib

//MINGW - Link with libcomctl32.a (-lcomctl32)

//MSVC  - Link with comctl32.lib

//=============================================================================

#include <windows.h>  //include all the basics

#include <tchar.h>    //string and other mapping macros

#if defined __MINGW_H

#define _WIN32_IE 0x0400

#endif

#include <commctrl.h>

#include <string>

#include <vector>

//define an unicode string type alias

typedef std::basic_string<TCHAR> ustring;

//=============================================================================

//message processing function declarations

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

int OnCreate(const HWND,CREATESTRUCT*);

void OnSize(const HWND hwnd,int,int,UINT);

//non-message function declarations

void AddToolbarButton(const HWND,TBBUTTON&,int,const ustring&,

                      BYTE style=TBSTYLE_BUTTON,DWORD_PTR data=0,int cmd=-1,

                      BYTE state=TBSTATE_ENABLED);

HWND CreateToolbar(const HWND,const HINSTANCE,DWORD,const RECT&,const int);

inline int ErrMsg(const ustring&);                    

void StartCommonControls(DWORD);

//setup some control id's

enum {

  IDC_TOOLBAR=200,

};

//=============================================================================

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR pStr,int nCmd)

{

ustring classname=_T("SIMPLEWND");

WNDCLASSEX wcx={0};  //used for storing information about the wnd 'class'

wcx.cbSize         = sizeof(WNDCLASSEX);          

wcx.lpfnWndProc    = WndProc;             //wnd Procedure pointer

wcx.hInstance      = hInst;               //app instance

//use 'LoadImage' to load wnd class icon and cursor as it supersedes the

//obsolete functions 'LoadIcon' and 'LoadCursor', although these functions will

//still work. Because the icon and cursor are loaded from system resources ie

//they are shared, it is not necessary to free the image resources with either

//'DestroyIcon' or 'DestroyCursor'.

wcx.hIcon         = reinterpret_cast<HICON>(LoadImage(0,IDI_APPLICATION,

                                            IMAGE_ICON,0,0,LR_SHARED));

wcx.hCursor       = reinterpret_cast<HCURSOR>(LoadImage(0,IDC_ARROW,

                                              IMAGE_CURSOR,0,0,LR_SHARED));

wcx.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_BTNFACE+1);  

wcx.lpszClassName = classname.c_str();

//the window 'class' (not c++ class) has to be registered with the system

//before windows of that 'class' can be created

if (!RegisterClassEx(&wcx))

  {

  ErrMsg(_T("Failed to register wnd class"));

  return -1;

  }

int desktopwidth=GetSystemMetrics(SM_CXSCREEN);

int desktopheight=GetSystemMetrics(SM_CYSCREEN);

HWND hwnd=CreateWindowEx(0,                     //extended styles

                         classname.c_str(),     //name: wnd 'class'

                         _T("Common Controls - Toolbar"), //wnd title

                         WS_OVERLAPPEDWINDOW,   //wnd style

                         desktopwidth/4,        //position:left

                         desktopheight/4,       //position: top

                         desktopwidth/2,        //width

                         desktopheight/2,       //height

                         0,                     //parent wnd handle

                         0,                     //menu handle/wnd id

                         hInst,                 //app instance

                         0);                    //user defined info

if (!hwnd)

  {

  ErrMsg(_T("Failed to create wnd"));

  return -1;

  }

ShowWindow(hwnd,nCmd);

UpdateWindow(hwnd);

//start message loop - windows applications are 'event driven' waiting on user,

//application or system signals to determine what action, if any, to take. Note

//that an error may cause GetMessage to return a negative value so, ideally, 

//this result should be tested for and appropriate action taken to deal with

//it(the approach taken here is to simply quit the application).

MSG msg;

while (GetMessage(&msg,0,0,0)>0)

  {

  TranslateMessage(&msg);

  DispatchMessage(&msg);

  }

return static_cast<int>(msg.wParam);

}

//=============================================================================

LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)

{

switch (uMsg)

  {

  case WM_CREATE:

    {

    return OnCreate(hwnd,reinterpret_cast<CREATESTRUCT*>(lParam));

    }

  case WM_DESTROY:

    {

    PostQuitMessage(0);    //signal end of application

    return 0;

    }

  case WM_SIZE:

    {

    OnSize(hwnd,LOWORD(lParam),HIWORD(lParam),static_cast<UINT>(wParam));

    return 0;

    }

  default:

    //let system deal with msg

    return DefWindowProc(hwnd,uMsg,wParam,lParam); 

  }

}

//=============================================================================

int OnCreate(const HWND hwnd,CREATESTRUCT *cs)

{

//handles the WM_CREATE message of the main, parent window; return -1 to fail

//window creation

RECT rc={0,0,0,0};  //set dimensions in parent window's WM_SIZE handler

StartCommonControls(ICC_BAR_CLASSES);

HWND hToolbar=CreateToolbar(hwnd,cs->hInstance,TBSTYLE_FLAT|CCS_ADJUSTABLE|

                            CCS_NODIVIDER,rc,IDC_TOOLBAR);

//now store the toolbar control handle as the user data associated with the

//parent window so that it can be retrieved for later use. This will emit a

//C4244 warning if /wp64 is enabled with ms compilers under win32 due to how

//SetWindowLongPtr is typedef'd for 32bit and 64bit compatibility. The warning

//in this context can be safely ignored. Despite this being identified as a

//glitch under msvc.net 2003, it still exists in the later msvc express 2005.

//A workaround would be to wrap the offending call in #pragma warning

//directives, or to typedef the fn properly for 32/64 bit compatibility.

//See http://msdn.microsoft.com/msdnmag/issues/01/08/bugslayer/

//for details.

SetWindowLongPtr(hwnd,GWLP_USERDATA,reinterpret_cast<LONG_PTR>(hToolbar));

TBADDBITMAP tbAddBmp={0};

std::vector<TBBUTTON> tbb(17);

//setup and add buttons

SendMessage(hToolbar,TB_BUTTONSTRUCTSIZE,

            static_cast<WPARAM>(sizeof(TBBUTTON)),0);

//add images

tbAddBmp.hInst=HINST_COMMCTRL;

tbAddBmp.nID=IDB_STD_SMALL_COLOR;

SendMessage(hToolbar,TB_ADDBITMAP,0,reinterpret_cast<WPARAM>(&tbAddBmp));

//add buttons

AddToolbarButton(hToolbar,tbb[0],STD_FILENEW,_T("New"));           

AddToolbarButton(hToolbar,tbb[1],STD_FILEOPEN,_T("Open"));

AddToolbarButton(hToolbar,tbb[2],STD_FILESAVE,_T("Save"));

AddToolbarButton(hToolbar,tbb[3],STD_PRINTPRE,_T("PrintPre"));          

AddToolbarButton(hToolbar,tbb[4],STD_PRINT,_T("Print"));

AddToolbarButton(hToolbar,tbb[5],0,_T(""),TBSTYLE_SEP);  //separator

AddToolbarButton(hToolbar,tbb[6],STD_DELETE,_T("Delete"));

AddToolbarButton(hToolbar,tbb[7],STD_COPY,_T("Copy"));

AddToolbarButton(hToolbar,tbb[8],STD_CUT,_T("Cut"));

AddToolbarButton(hToolbar,tbb[9],STD_PASTE,_T("Paste"));                          

AddToolbarButton(hToolbar,tbb[10],STD_REDOW,_T("Redo"));                            

AddToolbarButton(hToolbar,tbb[11],STD_UNDO,_T("Undo"));

AddToolbarButton(hToolbar,tbb[12],0,_T(""),TBSTYLE_SEP); //separator

AddToolbarButton(hToolbar,tbb[13],STD_PROPERTIES,_T("Props"));        

AddToolbarButton(hToolbar,tbb[14],STD_FIND,_T("Find"));                           

AddToolbarButton(hToolbar,tbb[15],STD_REPLACE,_T("Replace")); 

AddToolbarButton(hToolbar,tbb[16],STD_HELP,_T("Help"));                           

       

SendMessage(hToolbar,TB_ADDBUTTONS,tbb.size(),

            reinterpret_cast<LPARAM>(&tbb[0]));

                  

return 0;

}

//=============================================================================

void OnSize(const HWND hwnd,int cx,int cy,UINT flags)

{

//get the header control handle which has been previously stored in the user

//data associated with the parent window.

HWND hToolbar=reinterpret_cast<HWND>(static_cast<LONG_PTR>

                                     (GetWindowLongPtr(hwnd,GWLP_USERDATA)));

                                  

//resize tab common control so that it always fills parent's client area

MoveWindow(hToolbar,0,0,cx,0,TRUE);

}

//=============================================================================

void AddToolbarButton(const HWND hTb,TBBUTTON& tbb,int bmp,const ustring& txt,

                      BYTE style,DWORD_PTR data,int cmd,BYTE state)

{

tbb.iBitmap=bmp;

tbb.idCommand=cmd;

tbb.fsState=state;

tbb.fsStyle=style;

tbb.dwData=data;

tbb.iString=SendMessage(hTb,TB_ADDSTRING,0,

                        reinterpret_cast<LPARAM>(txt.c_str()));

}

//=============================================================================

HWND CreateToolbar(const HWND hParent,const HINSTANCE hInst,DWORD dwStyle,

                   const RECT& rc,const int id)

{

dwStyle|=WS_CHILD|WS_VISIBLE;

return CreateWindowEx(0,                  //extended styles

                      TOOLBARCLASSNAME,   //control 'class' name

                      0,                  //control caption

                      dwStyle,            //wnd style

                      rc.left,            //position: left

                      rc.top,             //position: top

                      rc.right,           //width

                      rc.bottom,          //height

                      hParent,            //parent window handle

                      //control's ID

                      reinterpret_cast<HMENU>(static_cast<INT_PTR>(id)),

                      hInst,              //instance

                      0);                 //user defined info

}

//=============================================================================

inline int ErrMsg(const ustring& s)

{

return MessageBox(0,s.c_str(),_T("ERROR"),MB_OK|MB_ICONEXCLAMATION);

}

//=============================================================================

void StartCommonControls(DWORD flags)

{

//load the common controls dll, specifying the type of control(s) required

INITCOMMONCONTROLSEX iccx;

iccx.dwSize=sizeof(INITCOMMONCONTROLSEX);

iccx.dwICC=flags;

InitCommonControlsEx(&iccx);

}

//=============================================================================

Comments (0)

You don't have permission to comment on this page.