MDI框架TabPane面板类的C++封装

把Tab控件做成一个MDI框架的边窗面板,支持一条边的虚移动。

坐标的转换比较烦,搞得头都大了。

运行效果如图。

 

 主要程序:

XTabPane.h

#pragma once
#include "xwnd.h"

#define XTABPANE_ISIDE_TOP                0x01
#define XTABPANE_ISIDE_BOTTOM        0x02
#define XTABPANE_ISIDE_LEFT                0x04
#define XTABPANE_ISIDE_RIGHT            0x08

class CXTabPane :
    public CXWnd
{
public:
    CXTabPane(void);
    ~CXTabPane(void);

XDECLARE_DYNCREATE(CXTabPane)

public:
    HWND        m_hTab;
    HWND        CreateTab (HWND hWndParent);
        
    CXWnd* m_pMain; 
    HWND m_hMainFrame;
    HWND m_hMainClient;

    virtual BOOL PreCreateWindow(WNDCLASSEX &cs);

    virtual int OnDestroy(HWND, UINT, WPARAM, LPARAM);

    int OnCreate(HWND, UINT, WPARAM, LPARAM);
    int OnSize(HWND, UINT, WPARAM, LPARAM);
    int OnClose(HWND, UINT, WPARAM, LPARAM);
    int OnNotify(HWND, UINT, WPARAM, LPARAM);
    int OnTimer(HWND, UINT, WPARAM, LPARAM);
    int OnLBDown(HWND, UINT, WPARAM, LPARAM);
    int OnLBUp(HWND, UINT, WPARAM, LPARAM);
    int OnMouseMove(HWND, UINT, WPARAM, LPARAM);

    HDC m_hdc_mem;
    HBITMAP m_hBitmap_mem;
    int m_xPos, m_yPos;
    
    int m_iMove;
    int m_iSide;       //top, bottom,left, right  1,2,4,8
    int InsertPage(TCHAR * tTitle, int iPos,int iImage, HWND hWndPage);
    int SetCurTab(int iItem);
    int DrawMoveBar(HDC hdc, int left, int top, int right, int bottom);

    XDECLARE_MESSAGE_MAP()
};

XTabPane.cpp

#include "StdAfx.h"
#include "XTabPane.h"

XIMPLEMENT_DYNCREATE(CXTabPane, CXWnd)

    XBEGIN_MESSAGE_MAP(CXTabPane, CXWnd)
    XON_MESSAGE(WM_CREATE, OnCreate)
    XON_MESSAGE(WM_SIZE, OnSize)
    XON_MESSAGE(WM_CLOSE, OnClose)
    XON_MESSAGE(WM_NOTIFY, OnNotify)
    XON_MESSAGE(WM_TIMER, OnTimer)
    XON_MESSAGE(WM_LBUTTONDOWN, OnLBDown)
    XON_MESSAGE(WM_LBUTTONUP, OnLBUp)
    XON_MESSAGE(WM_MOUSEMOVE, OnMouseMove)

XEND_MESSAGE_MAP()

CXTabPane::CXTabPane()
{
    wcscpy_s(szWindowClass,_T("XTabPane"));                                // The title bar text
    wcscpy_s(szTitle,_T("XTabPane"));
    m_iMove = 0;
}

CXTabPane::~CXTabPane(void)
{
}

HWND CXTabPane::CreateTab (HWND hWndParent) 
{
    HWND hWndTab; 
    
    InitCommonControls();
       
    hWndTab = CreateWindow(WC_TABCONTROL, NULL, 
        WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE|TCS_BOTTOM,  //TCS_BOTTOM
        0, 0, 0,0, 
        hWndParent, (HMENU)IDM_VIEW_Tab1, m_hInst, NULL); 
    if (hWndTab == NULL)
    { 
        return NULL; 
    }

    HIMAGELIST hImageList;
    hImageList = ImageList_Create(16, 16, ILC_COLOR32 | ILC_MASK,  15, 15);             //size 16x16  X15 
    for(unsigned int i = 0 ; i < 15; i++)
    {
        HICON  hIcon = LoadIcon(m_hInst, MAKEINTRESOURCE(IDI_ICON1 + i));
        ImageList_AddIcon(hImageList, hIcon);
        DestroyIcon(hIcon);
    }
    SendMessage(hWndTab, TCM_SETIMAGELIST, 0, (LPARAM)hImageList);

return hWndTab; } BOOL CXTabPane::PreCreateWindow(WNDCLASSEX &cs) { cs.style &= ~CS_HREDRAW; // OnSize 没必要刷新 cs.style &= ~CS_VREDRAW; return TRUE; } int CXTabPane::OnCreate(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { long style; style = GetWindowLong(hWnd,GWL_STYLE); // unsize style &= ~WS_THICKFRAME; SetWindowLong(hWnd, GWL_STYLE,style ); m_hTab = CreateTab(hWnd); return 1; } int CXTabPane::InsertPage(TCHAR * tTitle, int iPos,int iImage, HWND hWndPage) { TCITEM tie; tie.mask = TCIF_TEXT | TCIF_IMAGE|TCIF_PARAM; tie.iImage = iImage; tie.pszText = tTitle; tie.lParam = (LPARAM)hWndPage; if(TabCtrl_InsertItem(m_hTab, iPos, &tie) == -1) { return -1; } RECT rt; int sel = TabCtrl_GetCurSel(m_hTab); GetClientRect(m_hTab, &rt); TabCtrl_AdjustRect(m_hTab, FALSE, &rt); MoveWindow((HWND) tie.lParam, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top, TRUE); return 1; } int CXTabPane::SetCurTab( int iItem) //for hide other page { int i; int iItemCount; TCITEM tie; iItemCount = TabCtrl_GetItemCount(m_hTab); if(iItemCount < 0) return -1; if(iItem > iItemCount) iItem = 0; tie.mask = TCIF_PARAM; for( i = 0; i< iItemCount; i++) { if(TabCtrl_GetItem(m_hTab, i, &tie) == -1) { return -1; } if(i == iItem) { ShowWindow((HWND) tie.lParam, SW_SHOW); } else { ShowWindow((HWND) tie.lParam, SW_HIDE); } } TabCtrl_SetCurSel(m_hTab, iItem); return 1; } int CXTabPane::OnTimer(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { return 1; } int CXTabPane::OnSize(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int cxClient,cyClient; RECT rt; int iItem; int iItemCount; TCITEM tie; cxClient = LOWORD (lParam); cyClient = HIWORD (lParam); switch(m_iSide) { case 1: //top MoveWindow(m_hTab, 0, 0, cxClient, cyClient-6, TRUE); break; case 2: //down MoveWindow(m_hTab, 0, 6, cxClient, cyClient-6, TRUE); break; case 4: //left MoveWindow(m_hTab, 0, 0, cxClient-6, cyClient, TRUE); break; case 8: //right MoveWindow(m_hTab, 6, 0, cxClient-6, cyClient, TRUE); break; default: // unsize MoveWindow(m_hTab, 0, 0, cxClient, cyClient, TRUE); } iItem = TabCtrl_GetCurSel(m_hTab); if(iItem <0 ) { return CXWnd::OnSize( hWnd, message, wParam, lParam); } GetClientRect(m_hTab, &rt); //NEED TabCtrl_AdjustRect(m_hTab, FALSE, &rt); // Get Page iItemCount = TabCtrl_GetItemCount(m_hTab); tie.mask = TCIF_PARAM; for (iItem = 0; iItem< iItemCount; iItem++) { TabCtrl_GetItem(m_hTab, iItem, &tie); MoveWindow((HWND) tie.lParam, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top, TRUE); } return CXWnd::OnSize( hWnd, message, wParam, lParam); } int CXTabPane::OnNotify(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { TCITEM tie; int iItem; RECT rt; LPNMHDR lphr = (LPNMHDR)lParam; if (wParam ==IDM_VIEW_Tab1) { switch (lphr->code) { case TCN_SELCHANGING: iItem = TabCtrl_GetCurSel(m_hTab); tie.mask = TCIF_PARAM; TabCtrl_GetItem(m_hTab, iItem, &tie); ShowWindow((HWND) tie.lParam, SW_HIDE); break; case TCN_SELCHANGE: iItem = TabCtrl_GetCurSel(m_hTab); tie.mask = TCIF_PARAM; TabCtrl_GetItem(m_hTab, iItem, &tie); ShowWindow((HWND) tie.lParam, SW_SHOW); break; } } return ::DefWindowProc(hWnd, message, wParam, lParam); } int CXTabPane::OnClose(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { return 0; } int CXTabPane::OnDestroy(HWND, UINT, WPARAM, LPARAM) { m_hWnd = NULL; //closeall no OnClose, only OnDestroy, this is virtual return 1; } int CXTabPane::DrawMoveBar(HDC hdc, int left, int top, int right, int bottom) { POINT pt; MoveToEx(hdc, left, top,&pt); LineTo(hdc, right, top); LineTo(hdc, right, bottom); LineTo(hdc, left, bottom); LineTo(hdc, left, top); MoveToEx(hdc, (left + right)/2, top,&pt); LineTo(hdc, (left + right)/2, bottom); MoveToEx(hdc, left, (top+bottom)/2,&pt); LineTo(hdc, right, (top+bottom)/2); return 1; } int CXTabPane::OnLBDown(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HWND hWndFrame; HDC hdc_Frame; RECT rt; POINT pt; int iWidth; int iHigh; int iTop; int iLeft; hWndFrame = GetParent(hWnd); //frame hdc_Frame = GetDC(hWndFrame); GetWindowRect(hWnd, &rt); iWidth = rt.right - rt.left; iHigh = rt.bottom - rt.top; iTop = rt.top; iLeft = rt.left; SetCapture(hWnd); switch(m_iSide) { case XTABPANE_ISIDE_TOP: SetCursor(LoadCursor(NULL, IDC_SIZENS)); break; case XTABPANE_ISIDE_BOTTOM: SetCursor(LoadCursor(NULL, IDC_SIZENS)); pt.x= rt.left; pt.y = rt.top; ScreenToClient(hWndFrame, &pt); // 窗口右上角的屏幕坐标,转换为框架Client坐标 iTop = pt.y; //保存绘图点, iLeft = pt.x; //保存绘图点, m_hBitmap_mem = CreateCompatibleBitmap(hdc_Frame, iWidth, 6); //allot the space app break; case XTABPANE_ISIDE_LEFT: SetCursor(LoadCursor(NULL, IDC_SIZEWE)); //need pt.x= rt.right; pt.y = rt.top; ScreenToClient(hWndFrame, &pt); // 窗口右上角的屏幕坐标,转换为框架Client坐标 iTop = pt.y; //保存绘图点, m_hBitmap_mem = CreateCompatibleBitmap(hdc_Frame, 6, iHigh); //allot the space app break; case XTABPANE_ISIDE_RIGHT: SetCursor(LoadCursor(NULL, IDC_SIZEWE)); //need pt.x= rt.left; pt.y = rt.top; ScreenToClient(hWndFrame, &pt); // 窗口左上角的屏幕坐标,转换为框架Client坐标 iTop = pt.y; //保存绘图点, m_hBitmap_mem = CreateCompatibleBitmap(hdc_Frame, 6, iHigh); //allot the space app break; default: break; } m_hdc_mem = CreateCompatibleDC(hdc_Frame); SelectObject(m_hdc_mem, m_hBitmap_mem); GetCursorPos(&pt); //Screen Position ScreenToClient(hWndFrame, &pt); // Frame Position m_yPos = pt.y; m_xPos = pt.x; //save the Frame Positon GetClientRect(hWndFrame, &rt); switch(m_iSide) { case XTABPANE_ISIDE_TOP: case XTABPANE_ISIDE_BOTTOM: BitBlt(m_hdc_mem,0,0,iWidth,6, hdc_Frame, iLeft, m_yPos -3, SRCCOPY); //save DrawMoveBar(hdc_Frame, iLeft, m_yPos-2, iLeft+iWidth, m_yPos+2); break; case XTABPANE_ISIDE_LEFT: case XTABPANE_ISIDE_RIGHT: BitBlt(m_hdc_mem,0,0, 6, iHigh, hdc_Frame, m_xPos -3, iTop, SRCCOPY); //save DrawMoveBar(hdc_Frame, m_xPos-2, iTop,m_xPos+2, iTop+iHigh); break; default: break; } m_iMove =1; ReleaseDC(hWndFrame, hdc_Frame); return 1; } int CXTabPane::OnMouseMove(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HWND hWndFrame; HDC hdc_Frame; RECT rt; POINT pt; int Mouse_y; int iWidth; int Mouse_x; int iHigh; int iTop; int iLeft; Mouse_y = HIWORD(lParam); Mouse_x = LOWORD(lParam); //Plane Position GetClientRect(hWnd, &rt); switch(m_iSide) { case XTABPANE_ISIDE_TOP: if((rt.bottom-Mouse_y)<6) SetCursor(LoadCursor(NULL, IDC_SIZENS)); break; case XTABPANE_ISIDE_BOTTOM: if(Mouse_y < 6) SetCursor(LoadCursor(NULL, IDC_SIZENS)); break; case XTABPANE_ISIDE_LEFT: if((rt.right -Mouse_x)<6) SetCursor(LoadCursor(NULL, IDC_SIZEWE)); break; case XTABPANE_ISIDE_RIGHT: if(Mouse_x< 6) SetCursor(LoadCursor(NULL, IDC_SIZEWE)); break; default: break; } if(m_iMove ==0) // no Click capture { return 0; } SetCapture(hWnd); GetWindowRect(hWnd, &rt); iWidth = rt.right - rt.left; iHigh = rt.bottom - rt.top; iTop = rt.top; iLeft = rt.left; hWndFrame = GetParent(hWnd); hdc_Frame = GetDC(hWndFrame); //Frame DC switch(m_iSide) { case XTABPANE_ISIDE_TOP: if((rt.bottom-Mouse_y)<6) SetCursor(LoadCursor(NULL, IDC_SIZENS)); break; case XTABPANE_ISIDE_BOTTOM: pt.x= rt.left; pt.y = rt.top; ScreenToClient(hWndFrame, &pt); // 窗口右上角的屏幕坐标,转换为框架Client坐标 iTop = pt.y; //保存绘图点, iLeft = pt.x; BitBlt(hdc_Frame, iLeft, m_yPos - 3, iWidth, 6, m_hdc_mem, 0, 0, SRCCOPY); // restore yPos is old break; case XTABPANE_ISIDE_LEFT: pt.x= rt.right; pt.y = rt.top; ScreenToClient(hWndFrame, &pt); // 窗口右上角的屏幕坐标,转换为框架Client坐标 iTop = pt.y; //保存绘图点, BitBlt(hdc_Frame, m_xPos -3, iTop, 6, iHigh, m_hdc_mem, 0, 0, SRCCOPY); // restore yPos is old break; case XTABPANE_ISIDE_RIGHT: pt.x= rt.left; pt.y = rt.top; ScreenToClient(hWndFrame, &pt); // 窗口左上角的屏幕坐标,转换为框架Client坐标 iTop = pt.y; //保存绘图点, BitBlt(hdc_Frame, m_xPos -3, iTop, 6, iHigh, m_hdc_mem, 0, 0, SRCCOPY); // restore yPos is old break; default: break; } GetCursorPos(&pt); //Screen Position ScreenToClient(hWndFrame, &pt); // Frame Position m_yPos = pt.y; m_xPos = pt.x; //save the Frame Positon switch(m_iSide) { case XTABPANE_ISIDE_TOP: case XTABPANE_ISIDE_BOTTOM: BitBlt(m_hdc_mem, 0,0,iWidth,6, hdc_Frame,iLeft,m_yPos-3, SRCCOPY); //save Frame yPos is new DrawMoveBar(hdc_Frame, iLeft, m_yPos-2, iLeft+iWidth, m_yPos+2); break; case XTABPANE_ISIDE_LEFT: case XTABPANE_ISIDE_RIGHT: BitBlt(m_hdc_mem,0,0, 6, iHigh, hdc_Frame, m_xPos -3, iTop, SRCCOPY); //save Frame xPos is new DrawMoveBar(hdc_Frame, m_xPos-2, iTop,m_xPos+2, iTop+iHigh); break; default: break; } ReleaseDC(hWndFrame,hdc_Frame); return 1; } int CXTabPane::OnLBUp(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HWND hWndFrame; HDC hdc_Frame; RECT rt; POINT pt; int Mouse_x; int Mouse_y; int iWidth; int iHigh; int iTop; int iLeft; hWndFrame = GetParent(hWnd); //frame hdc_Frame = GetDC(hWndFrame); GetWindowRect(hWnd, &rt); iWidth = rt.right - rt.left; iHigh = rt.bottom - rt.top; iTop = rt.top; iLeft = rt.left; ReleaseCapture(); m_iMove =0; switch(m_iSide) { case XTABPANE_ISIDE_TOP: if((rt.bottom-Mouse_y)<6) SetCursor(LoadCursor(NULL, IDC_SIZENS)); break; case XTABPANE_ISIDE_BOTTOM: pt.x= rt.left; pt.y = rt.top; ScreenToClient(hWndFrame, &pt); // 窗口右上角的屏幕坐标,转换为框架Client坐标 iTop = pt.y; //保存绘图点, iLeft = pt.x; BitBlt(hdc_Frame, iLeft, m_yPos - 3, iWidth, 6, m_hdc_mem, 0, 0, SRCCOPY); // restore yPos is old SendMessage(hWndFrame,WM_COMMAND, IDM_WM_RESIZE, (LPARAM) m_yPos); pt.x= rt.left; pt.y = rt.bottom; ScreenToClient(hWndFrame, &pt); MoveWindow(hWnd, pt.x, m_yPos, iWidth, pt.y-m_yPos, TRUE); //Client 没变,需要OnSize设置Client SendMessage(hWndFrame,WM_COMMAND, IDM_WM_REALIGN, 0); //重排窗口 break; case XTABPANE_ISIDE_LEFT: pt.x= rt.right; pt.y = rt.top; ScreenToClient(hWndFrame, &pt); // 窗口右上角的屏幕坐标,转换为框架Client坐标 iTop = pt.y; //保存绘图点, BitBlt(hdc_Frame, m_xPos -3, iTop, 6, iHigh, m_hdc_mem, 0, 0, SRCCOPY); // restore yPos is old pt.x= rt.left; pt.y = rt.top; ScreenToClient(hWndFrame, &pt); MoveWindow(hWnd, pt.x, pt.y, m_xPos - pt.x, iHigh, TRUE); //Client 没变,需要OnSize设置Client SendMessage(hWndFrame,WM_COMMAND, IDM_WM_REALIGN, 0); //重排窗口 break; case XTABPANE_ISIDE_RIGHT: pt.x= rt.left; pt.y = rt.top; ScreenToClient(hWndFrame, &pt); // 窗口左上角的屏幕坐标,转换为框架Client坐标 iTop = pt.y; //保存绘图点, BitBlt(hdc_Frame, m_xPos -3, iTop, 6, iHigh, m_hdc_mem, 0, 0, SRCCOPY); // restore yPos is old pt.x= rt.right; pt.y = rt.top; ScreenToClient(hWndFrame, &pt); MoveWindow(hWnd, m_xPos, pt.y, pt.x - m_xPos, iHigh, TRUE); //Client 没变,需要OnSize设置Client SendMessage(hWndFrame,WM_COMMAND, IDM_WM_REALIGN, 0); //重排窗口 break; default: break; } ReleaseDC(hWndFrame,hdc_Frame); DeleteDC(m_hdc_mem); DeleteObject(m_hBitmap_mem); return 1; }

在框架中使用面板类:

XMDIFrameEx.h

#pragma once

#include "xwnd.h"
#include "stdio.h"
#include "xmdiframe.h"

#include "XTabPane.h"
#include "PrjTree.h"
#include "MsgBox.h"
#include "StrBox.h"
#include "Report.h"

class CXMDIFrameEx :
    public CXMDIFrame
{
public:
    CXMDIFrameEx(void);
    ~CXMDIFrameEx(void);

    XDECLARE_DYNCREATE(CXMDIFrameEx)
public:
    HWND        m_hStatusBar;
    HWND        m_hWndToolBar;
    HWND        m_hWndToolBarWork;
    HWND        m_hWndComboBox;
    HWND        m_hWndReBar;
    HWND        m_hWndPB; 

    int         m_StatusBarHight;
    int         m_ToolBarHight;
    
    HWND CreateMainToolbar(HWND hWnd);
    HWND CreateToolbarWork(HWND hWnd);
    HWND CreateToolbarCombo(HWND hWnd);
    HWND CreateComboBox(HWND hWnd);
    HWND CreateMainStatusbar(HWND hWnd);
    HWND CreateRebar(HWND hwndOwner);
    
    int OnNotify(HWND, UINT, WPARAM, LPARAM);
    int OnReAlign(HWND, UINT, WPARAM, LPARAM);
    
    int OnCreate(HWND, UINT, WPARAM, LPARAM);
    int OnSize(HWND, UINT, WPARAM, LPARAM);
    int OnAbout(HWND, UINT, WPARAM, LPARAM);

    int OnTest2(HWND, UINT, WPARAM, LPARAM);
    virtual int OnTest1(HWND, UINT, WPARAM, LPARAM);

     int Test();

     RECT        m_rtAreaClient;  //xgz for panel

     HDC hdc_mem;
     HBITMAP hBitmap_mem;
     int xPos, yPos;
    
     int m_BottomPanelHight;
     int m_PLeftWidth;
     int m_PRightWidth;

      CXTabPane* m_pTabPaneLeft;
      CXTabPane* m_pTabPaneRight;
      CXTabPane* m_pTabPaneBottom;

      CPrjTree*  m_pPrjTree; 
      CPrjTree*  m_pPrjTree2; 
      CMsgBox*  m_pMsg; 
      CStrBox*  m_pStrBox; 
      CReport*  m_pReport; 
   
    XDECLARE_MESSAGE_MAP()
};

XMDIFrameEx.cpp

#include "StdAfx.h"
#include "XMDIFrameEx.h"
#include "XMDIView.h"

XIMPLEMENT_DYNCREATE(CXMDIFrameEx, CXMDIFrame)

XBEGIN_MESSAGE_MAP(CXMDIFrameEx, CXMDIFrame)
    XON_MESSAGE(WM_CREATE, OnCreate)
    XON_MESSAGE(WM_SIZE, OnSize)
    XON_MESSAGE(WM_NOTIFY, OnNotify)
    XON_COMMAND(IDM_ABOUT,  OnAbout)
    XON_COMMAND(IDM_FILE_NEWHELLO,  OnNew)
    XON_COMMAND(IDM_TEST_TEST2,  OnTest2)
    XON_COMMAND(IDM_TEST_TEST1,  OnTest1)
    XON_COMMAND(IDM_WM_REALIGN,  OnSize)
XEND_MESSAGE_MAP()

CXMDIFrameEx::CXMDIFrameEx(void)
{
    wcscpy_s(szWindowClass,_T("XMDIFrameEx"));                        // The title bar text
    wcscpy_s(szTitle,_T("XMDIFrameEx"));                                    // The title bar text

    m_hWnd = NULL;
    m_hWndClient = NULL;   //xgz  important for msg loop
        
    m_pTabPaneLeft = new CXTabPane();
    m_pTabPaneRight = new CXTabPane();
    m_pTabPaneBottom = new CXTabPane();

    m_pPrjTree = new CPrjTree();
    m_pPrjTree2 = new CPrjTree();
    m_pMsg = new CMsgBox(); 
    m_pStrBox = new CStrBox(); 
    m_pReport = new CReport(); 
}

CXMDIFrameEx::~CXMDIFrameEx(void)
{
    delete m_pPrjTree;
    delete m_pPrjTree2;
    delete m_pMsg;
    delete m_pStrBox;
    delete m_pReport;
    
    delete m_pTabPaneLeft;
    delete m_pTabPaneRight;
    delete m_pTabPaneBottom;
}

HWND CXMDIFrameEx::CreateMainStatusbar(HWND hWnd)
{
    int Rightend[3];
    RECT rt;

    GetClientRect(hWnd,&rt);
    
    HWND hWndStatusBar = CreateWindowEx(0,     STATUSCLASSNAME,  _T(""),
        WS_CHILD |WS_VISIBLE|SBS_SIZEGRIP,
        0, 0, 0, 0,
        hWnd,
        (HMENU)IDC_MAINSTATUSBAR,
        m_hInst,
        NULL);

    if(!hWndStatusBar)
        return NULL;

    Rightend[0] = rt.right/2;
    Rightend[1] = rt.right*3/4;
    Rightend[2] = rt.right;

    //set statusbar to three segment
    SendMessage(hWndStatusBar,SB_SETPARTS,(WPARAM)3,(LPARAM)Rightend);

    MoveWindow(hWndStatusBar, 0,  0, 0, 0,TRUE); 

    //TextOut in statusbar
    SendMessage(hWndStatusBar, SB_SETTEXT, 0, (long)TEXT("Status 0"));
    SendMessage(hWndStatusBar, SB_SETTEXT, 1, (long)TEXT("========test====="));
    SendMessage(hWndStatusBar, SB_SETTEXT, 2, (long)TEXT("Step 2")); 

    HWND hWndStatic = CreateWindow(TEXT("static"),NULL,
        WS_CHILD|WS_BORDER|WS_VISIBLE|ES_CENTER,
        0,0,0,0,
        hWndStatusBar, (HMENU) 0, m_hInst, NULL);

    MoveWindow(hWndStatic,100,5,90,20,TRUE);    
    SetWindowText(hWndStatic, _T("Static"));

    HWND hWndEdit = CreateWindow(TEXT("edit"),NULL,
        WS_CHILD|WS_BORDER|WS_VISIBLE,
        0,0,0,0,
        hWndStatusBar, (HMENU) 0, m_hInst, NULL);
    
    MoveWindow(hWndEdit,200,5,90,20,TRUE);    

    m_hWndPB = CreateWindowEx( 0,PROGRESS_CLASS,NULL,
                        WS_CHILD | WS_VISIBLE,
                        0,0,0,0,            //位置和大小在WM_SIZE中设置
                       hWndStatusBar,
                     (HMENU)0,  m_hInst,   NULL);

    MoveWindow(m_hWndPB,300, 5,90,20,TRUE);    
     
    SendMessage( m_hWndPB, PBM_SETRANGE,   (WPARAM)0, (LPARAM)(MAKELPARAM(0,100)) );//设置进度条的范围
    SendMessage( m_hWndPB, PBM_DELTAPOS,   (WPARAM) 50, (LPARAM)0 );//设置进度条的位置
    return hWndStatusBar;
}

HWND CXMDIFrameEx::CreateMainToolbar(HWND hWnd)
{
    TBBUTTON tbButton[] = {
        { STD_FILENEW,  IDM_FILE_NEWHELLO, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_FILEOPEN, IDM_TEST_TEST2, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_FILESAVE, IDM_TEST_TEST1, TBSTATE_ENABLED , TBSTYLE_BUTTON , 0L, 0},
        { STD_HELP, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1},
        { STD_FIND, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_UNDO, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_REDOW, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1},
        { STD_COPY, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_PASTE, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_CUT, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_DELETE, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_FILESAVE, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_PROPERTIES, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_FIND, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_REPLACE, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_PRINT, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_FILESAVE, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_FILESAVE, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { STD_PRINTPRE, IDM_EXIT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}
    };
    
    HINSTANCE hLib = (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE); //It can be other DLL,here same as m_hInst
        
    HWND hWndToolbar = CreateWindowEx(0,     TOOLBARCLASSNAME,    _T(""),
        TBSTYLE_FLAT|WS_CHILD |WS_VISIBLE|TBSTYLE_TOOLTIPS |CCS_NORESIZE| CCS_ADJUSTABLE|CCS_NODIVIDER|CCS_NOPARENTALIGN, //for rebar 
        0,0, 0,0,
        hWnd,    (HMENU) IDC_MAINTOOLSBAR,    m_hInst, NULL);
    
    if(!hWndToolbar)
        return NULL;

    SendMessage(hWndToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
    SendMessage(hWndToolbar, TB_SETEXTENDEDSTYLE, 0, (LPARAM)(DWORD)(TBSTYLE_EX_DRAWDDARROWS));

    TBADDBITMAP tbBitmap1;
    tbBitmap1.hInst = HINST_COMMCTRL;
    tbBitmap1.nID = IDB_STD_SMALL_COLOR;
    SendMessage(hWndToolbar, TB_ADDBITMAP, 0, (LPARAM)&tbBitmap1);
    
    SendMessage(hWndToolbar, TB_SETBITMAPSIZE, 0, (LPARAM)MAKELONG(16, 16)); //size 16x16
    SendMessage(hWndToolbar, TB_AUTOSIZE, 0, 0);
    SendMessage(hWndToolbar, TB_ADDBUTTONS, 15, (LONG) &tbButton);   //add 6 button
    
    return hWndToolbar;
}

HWND CXMDIFrameEx::CreateToolbarWork(HWND hWnd)
{
    TBBUTTON tbButton[] = {
        { 7,  IDM_FILE_NEWHELLO, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { 8, IDM_TEST_TEST2, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { 9, IDM_TEST_TEST1, TBSTATE_ENABLED , TBSTYLE_BUTTON , 0L, 0},
        { 10, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1},
        { 4, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { 5, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { 6, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { 0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1},
        { 7, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { 8, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { 9, IDM_TEST_TEST3, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
        { 10, IDM_EXIT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0}
    };
    
    HINSTANCE hLib = (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE); //It can be other DLL,here same as m_hInst

    HWND hWndToolbar = CreateWindowEx(0,     TOOLBARCLASSNAME,    _T(""),
        TBSTYLE_FLAT|WS_CHILD |WS_VISIBLE|TBSTYLE_TOOLTIPS |CCS_NORESIZE| CCS_ADJUSTABLE|CCS_NODIVIDER|CCS_NOPARENTALIGN, //for rebar 
        0,0, 0,0,
        hWnd,    (HMENU) IDC_TOOLSBARWORK,    m_hInst, NULL);

    if(!hWndToolbar)
        return NULL;

    SendMessage(hWndToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
    SendMessage(hWndToolbar, TB_SETEXTENDEDSTYLE, 0, (LPARAM)(DWORD)(TBSTYLE_EX_DRAWDDARROWS));

        HIMAGELIST hImageList=ImageList_Create(16,16,ILC_COLOR16,1,10);
        HBITMAP hBitMap=LoadBitmap(m_hInst,MAKEINTRESOURCE(IDB_BITMAP1));
        ImageList_Add(hImageList,hBitMap,NULL);
        DeleteObject(hBitMap);
        SendMessage(hWndToolbar, TB_SETIMAGELIST, 0, (LPARAM)hImageList);

    SendMessage(hWndToolbar, TB_SETBITMAPSIZE, 0, (LPARAM)MAKELONG(16, 16)); //size 16x16
    SendMessage(hWndToolbar, TB_AUTOSIZE, 0, 0);
    SendMessage(hWndToolbar, TB_ADDBUTTONS, 4, (LONG) &tbButton);   //add 4 button

return hWndToolbar; } HWND CXMDIFrameEx::CreateComboBox(HWND hWnd) { HWND hwndCombo; TCHAR *szStrings[] = {_T("Default"), _T("Random"), _T("Repeat")}; // Create the combo box and add it to the toolbar. hwndCombo = CreateWindowEx (0L, // no extended styles _T("COMBOBOX"), // class name _T(""), // default text WS_CHILD | WS_BORDER | WS_VISIBLE | CBS_HASSTRINGS | CBS_DROPDOWN, // styles and defaults 0, 0, 0, 250, // only list size, position no need in rebar hWnd, (HMENU)IDM_COMBO, m_hInst, NULL); if (hwndCombo) { // Add strings to the combo box. for (int idx = 0; idx < sizeof szStrings / sizeof szStrings[0]; idx++) SendMessage (hwndCombo, CB_INSERTSTRING, (WPARAM)(-1), (LPARAM)szStrings[idx]); } MoveWindow(hwndCombo, 0, 200, 200, 20, TRUE); //strange return hwndCombo; } HWND CXMDIFrameEx::CreateRebar(HWND hwndOwner) { REBARINFO rbi; REBARBANDINFO rbBand; RECT rc; HWND hwndTB, hwndRB, hwndCB; DWORD dwBtnSize; //InitCommonControls(); hwndRB = CreateWindowEx(WS_EX_TOOLWINDOW, REBARCLASSNAME, NULL, WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN | CCS_NODIVIDER , 0,0,0,0, hwndOwner, NULL, m_hInst, NULL); if(!hwndRB) return NULL; // Initialize and send the REBARINFO structure. rbi.cbSize = sizeof(REBARINFO); // Required when using this rbi.fMask = 0; rbi.himl = (HIMAGELIST)NULL; if(!SendMessage(hwndRB, RB_SETBARINFO, 0, (LPARAM)&rbi)) return NULL; // Initialize structure members that both bands will share. rbBand.cbSize = sizeof(REBARBANDINFO); // Required rbBand.fMask = RBBIM_COLORS | RBBIM_TEXT | RBBIM_BACKGROUND |RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE |RBBIM_SIZE ; rbBand.fStyle = RBBS_CHILDEDGE | RBBS_FIXEDBMP | RBBS_GRIPPERALWAYS; //| RBBS_FIXEDSIZE|RBBS_BREAK; rbBand.hbmBack = NULL; //rbBand.hbmBack = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP2)); //backpicture rbBand.fMask = RBBIM_SIZE | RBBIM_STYLE| RBBIM_CHILD |RBBIM_CHILDSIZE| RBBIM_TEXT |RBBIM_COLORS; dwBtnSize = (DWORD) SendMessage(m_hWndToolBar, TB_GETBUTTONSIZE, 0,0); // Set values unique to the band with the toolbar. rbBand.lpText = _T("TB"); rbBand.hwndChild = m_hWndToolBar; rbBand.cxMinChild = 100; rbBand.cyMinChild = HIWORD(dwBtnSize); rbBand.cx = 500; rbBand.clrFore = RGB(250,250,250); rbBand.clrBack = RGB(0,0,200); rbBand.fMask = rbBand.fMask & ~RBBIM_COLORS &~ RBBIM_TEXT ; //no need bk color and TEXT SendMessage(hwndRB, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand); // Add the band that has the toolbar. rbBand.hwndChild = m_hWndToolBarWork; rbBand.cxMinChild = 200; rbBand.cyMinChild = 20; //rbBand.cyChild = 50; rbBand.cx = 200; rbBand.clrFore = RGB(250,250,0); rbBand.clrBack = RGB(100,0,0); rbBand.fStyle = rbBand.fStyle |RBBS_FIXEDSIZE; //fixed on right rbBand.lpText = _T("RUN"); rbBand.fMask = rbBand.fMask | RBBIM_TEXT ; // add TEXT SendMessage(hwndRB, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand); hwndCB = CreateWindow(_T("Button"),_T("Button"), BS_PUSHBUTTON|WS_CHILD, 0,0,50,20, hwndOwner, NULL,m_hInst,NULL); // Set values unique to the band with the combo box. GetWindowRect(hwndCB, &rc); rbBand.lpText = _T("Bu1"); rbBand.hwndChild = hwndCB; rbBand.cxMinChild = 100; rbBand.cyMinChild = rc.bottom - rc.top; rbBand.cx = 100; SendMessage(hwndRB, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand); return (hwndRB); } int CXMDIFrameEx::OnCreate(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { CLIENTCREATESTRUCT clientcreate; clientcreate.hWindowMenu = m_hMenuWindow; clientcreate.idFirstChild = IDM_FIRSTCHILD; //xgz key for active star m_hWndClient = CreateWindow(TEXT("MDICLIENT"), NULL, WS_CHILD|WS_CLIPCHILDREN |WS_VISIBLE, 0,0,0,0, m_hWnd, (HMENU) 1, m_hInst, (PSTR) &clientcreate); m_hWndToolBar = CreateMainToolbar(hWnd); m_hWndToolBarWork = CreateToolbarWork(hWnd); m_hWndComboBox = CreateComboBox(m_hWndToolBarWork); MoveWindow(m_hWndComboBox, 100, 0, 100, 20, TRUE); //strange m_hWndReBar = CreateRebar(hWnd); m_hStatusBar = CreateMainStatusbar(hWnd); m_pTabPaneBottom->m_pMain = this; m_pTabPaneBottom->m_iSide = XTABPANE_ISIDE_BOTTOM; m_pTabPaneBottom->Create(m_hInst, m_hWnd, SW_SHOW); m_BottomPanelHight = 200; // changed before MoveWindow(m_pTabPaneBottom->m_hWnd, 0, 0, 100, m_BottomPanelHight, TRUE); //strange m_pTabPaneLeft->m_pMain = this; m_pTabPaneLeft->m_iSide = XTABPANE_ISIDE_LEFT; m_pTabPaneLeft->Create(m_hInst, m_hWnd, SW_SHOW); m_PLeftWidth = 200; // changed before MoveWindow(m_pTabPaneLeft->m_hWnd, 0, 30, m_PLeftWidth, 100, TRUE); //strange m_pTabPaneRight->m_pMain = this; m_pTabPaneRight->m_iSide = XTABPANE_ISIDE_RIGHT; m_pTabPaneRight->Create(m_hInst, m_hWnd, SW_SHOW); m_PRightWidth = 200; // changed before MoveWindow(m_pTabPaneRight->m_hWnd, m_PRightWidth, 30, m_PRightWidth,100, TRUE); //strange m_pPrjTree->m_pMainFrame = this; m_pPrjTree->Create(m_hInst, m_pTabPaneLeft->m_hTab); m_pTabPaneLeft->InsertPage(_T("PRJ"),0, 10, m_pPrjTree->m_hWnd); m_pPrjTree2->m_pMainFrame = this; m_pPrjTree2->Create(m_hInst, m_pTabPaneLeft->m_hTab); m_pTabPaneLeft->InsertPage(_T("PRJ2"),1, 11, m_pPrjTree2->m_hWnd); m_pTabPaneLeft->SetCurTab(0); m_pMsg->m_pMainFrame = this; m_pMsg->Create(m_hInst, m_pTabPaneBottom->m_hTab); m_pTabPaneBottom->InsertPage(_T("MSG"),0, 3, m_pMsg->m_hWnd); m_pStrBox->m_pMainFrame = this; m_pStrBox->Create(m_hInst, m_pTabPaneBottom->m_hTab); m_pTabPaneBottom->InsertPage(_T("STR"),1, 4, m_pStrBox->m_hWnd); m_pTabPaneBottom->SetCurTab(0); m_pReport->m_pMainFrame = this; m_pReport->Create(m_hInst, m_pTabPaneRight->m_hTab); m_pTabPaneRight->InsertPage(_T("Stock"),0, 4, m_pReport->m_hWnd); m_pTabPaneRight->SetCurTab(0); Init(); return 0; } int CXMDIFrameEx::OnSize(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { return OnReAlign(hWnd, message, wParam, lParam); //return DefFrameProc(hWnd, m_hWndClient, message, wParam, lParam); } int CXMDIFrameEx::OnReAlign(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { RECT rt, rtClient; int iRebarHight; int iStatusHight; int iPBottomHight; int iPLeftWidth; int iPRightWidth; GetClientRect(hWnd, &rtClient); //frame client size not m_client size GetClientRect(hWnd, &m_rtAreaClient); // the Client work area; GetWindowRect(m_hWndReBar, &rt); //rebar on the top iRebarHight = rt.bottom - rt.top; m_rtAreaClient.top += iRebarHight; GetWindowRect(m_hStatusBar, &rt); //statusbar on the bottom iStatusHight = rt.bottom - rt.top; m_rtAreaClient.bottom -= iStatusHight; GetWindowRect(m_pTabPaneBottom->m_hWnd, &rt); //Bottom on the bottom iPBottomHight = rt.bottom - rt.top; m_rtAreaClient.bottom -= iPBottomHight; GetWindowRect(m_pTabPaneLeft->m_hWnd, &rt); //left iPLeftWidth = rt.right-rt.left; m_rtAreaClient.left +=iPLeftWidth; GetWindowRect(m_pTabPaneRight->m_hWnd, &rt); //right iPRightWidth = rt.right-rt.left; m_rtAreaClient.right -= iPRightWidth; MoveWindow(m_hStatusBar, 0, 0, 0, 0,TRUE); MoveWindow(m_hWndReBar, 0, 0, 0, 0,TRUE); MoveWindow(m_pTabPaneBottom->m_hWnd, 0, m_rtAreaClient.bottom, //+6, // for split rtClient.right-rtClient.top, iPBottomHight , TRUE); MoveWindow(m_pTabPaneLeft->m_hWnd, 0, m_rtAreaClient.top, iPLeftWidth, m_rtAreaClient.bottom-m_rtAreaClient.top , TRUE); MoveWindow(m_pTabPaneRight->m_hWnd, m_rtAreaClient.right, m_rtAreaClient.top, iPRightWidth, m_rtAreaClient.bottom-m_rtAreaClient.top, TRUE); MoveWindow(m_hWndClient, m_rtAreaClient.left,m_rtAreaClient.top,m_rtAreaClient.right-m_rtAreaClient.left,m_rtAreaClient.bottom-m_rtAreaClient.top,TRUE); return 1; } int CXMDIFrameEx::Test() { PRINT(_T("\r\n CXMDIFrameEx::Test()")); return 1; } int CXMDIFrameEx::OnTest1(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PRINT(_T("\r\n CXMDIFrameEx::OnTest1")); Test(); return 1; } int CXMDIFrameEx::OnTest2(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { OnReAlign( hWnd, message, wParam, lParam); return 1; } int CXMDIFrameEx::OnAbout(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { MessageBox(hWnd, _T("Frame"),_T("About"),MB_OK); return 0; } int CXMDIFrameEx::OnNotify(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { RECT rtBar; LPNMHDR lphr = (LPNMHDR)lParam; if (lphr->hwndFrom == m_hWndReBar) { switch (lphr->code) { case RBN_AUTOSIZE: PRINT(_T("\r\n RBN_AUTOSIZE")); break; case RBN_ENDDRAG: PRINT(_T("\r\n RBN_ENDDRAG")); break; case RBN_LAYOUTCHANGED: GetWindowRect(m_hWndReBar, &rtBar); PRINT(_T("\r\n Lay(ltrb)=%d,%d,%d,%d"),rtBar.left,rtBar.top,rtBar.right,rtBar.bottom); OnReAlign(hWnd, message, wParam, lParam); break; default: break; } } // return 0; return DefMDIChildProc(hWnd, message, wParam, lParam); }

 

posted @ 2022-05-19 11:39  XGZ21  阅读(145)  评论(0编辑  收藏  举报