📄 panel.cpp
字号:
#include "GKL.h"
using namespace GKL;
Panel::Panel(Window *pWnd, int x/* = 0*/, int y/* = 0*/,
int width/* = 0*/, int height/* = 0*/, int dirtyMark/* = DIRTY_STATE_UPPER*/):
DIRTY_MARK(dirtyMark),
mpWnd(pWnd),
mhMemDC(NULL),
mhMemBMP(NULL), mhMemBMPOld(NULL),
mhDrawProc(NULL),
mX(x), mY(y),
mWidth(width), mHeight(height),
mDirtyState(DIRTY_STATE_INIT)
{
alert(mpWnd == NULL);
alert(mpWnd->gethWnd() == NULL);
// Prepare the memory DC
HDC hDC = GetDC(mpWnd->gethWnd());
mhMemDC = CreateCompatibleDC(hDC);
alert(mhMemDC == NULL);
mhMemBMP = CreateCompatibleBitmap(hDC, width, height);
alert(mhMemBMP == NULL);
mhMemBMPOld = (HBITMAP)SelectObject(mhMemDC, mhMemBMP);
}
Panel::~Panel(void)
{
if(mhMemDC != NULL)
{
alert(mhMemBMP != SelectObject(mhMemDC, mhMemBMPOld));
mhMemBMPOld = NULL;
DeleteObject(mhMemBMP);
mhMemBMP = NULL;
DeleteDC(mhMemDC);
mhMemDC = NULL;
}
// remove all controls, don't forget it
clearControlList();
}
int Panel::addControl(Control *pControl)
{
list<Control*>::iterator itor;
itor = find(mControlList.begin(), mControlList.end(), pControl);
alert(itor != mControlList.end());
if(pControl->mpPnl != NULL)
pControl->mpPnl->removeControl(pControl);
mControlList.push_back(pControl);
pControl->mpPnl = this;
return 0;
}
int Panel::removeControl(Control *pControl)
{
list<Control*>::iterator itor;
itor = find(mControlList.begin(), mControlList.end(), pControl);
if(itor == mControlList.end())
return -1;
mControlList.erase(itor);
pControl->mpPnl = NULL;
return 0;
}
int Panel::clearControlList(void)
{
list<Control*>::iterator itor;
for(itor = mControlList.begin(); itor != mControlList.end(); itor++)
(*itor)->mpPnl = NULL;
mControlList.clear();
}
HDC Panel::gethMemDC(void)
{
return mhMemDC;
}
void Panel::getPosition(int &x, int &y)
{
x = mX;
y = mY;
}
void Panel::getPosition(POINT &point)
{
point.x = mX;
point.y = mY;
}
void Panel::getSize(int &width, int &height)
{
width = mWidth;
height = mHeight;
}
void Panel::WindowToPanel(int &x, int &y)
{
x -= mX;
y -= mY;
}
void Panel::WindowToPanel(POINT &point)
{
point.x -= mX;
point.y -= mY;
}
void Panel::draw(bool needThread)
{
if(needThread)
{
if(mhDrawProc == NULL)
mhDrawProc = CreateThread(NULL, 0, drawProc, (LPVOID)this, 0, NULL);
}
else
{
drawBkg();
drawControls();
markDirty();
}
}
int Panel::onTrigger(void *pParam)
{
RefreshParam *pRP = (RefreshParam*)pParam;
switch(pRP->flag & METHOD_MASK)
{
case METHOD_DETECT:
detect(pParam);
break;
case METHOD_REFRESH:
refresh(pParam);
break;
default:
alert(true);
}
}
void Panel::detect(void *pParam)
{
RefreshParam *pRP = (RefreshParam*)pParam;
list<Control*>::iterator itor;
if(mDirtyState == DIRTY_STATE_INIT)
draw(false);
else
{
int flagDraw = DRAW_NONE;
for(itor = mControlList.begin(); itor != mControlList.end(); itor++)
{
if(((*itor)->onDrawDetect(flagDraw)) < 0)
break;
}
switch(flagDraw)
{
case DRAW_NONE:
break;
case DRAW_NORMAL:
draw(false);
break;
case DRAW_USETHREAD:
draw(true);
break;
default:
alert(true);
}
}
switch(mDirtyState)
{
case DIRTY_STATE_CLEAN:
break;
case DIRTY_STATE_UPPER:
if((pRP->flag & REFRESH_MASK) == REFRESH_NONE)
{
pRP->flag = (pRP->flag & METHOD_MASK) | REFRESH_UPPER;
pRP->pChanger = this;
}
break;
case DIRTY_STATE_ALL:
if((pRP->flag & REFRESH_MASK) != REFRESH_ALL)
{
pRP->flag = (pRP->flag & METHOD_MASK) | REFRESH_ALL;
pRP->pChanger = this;
}
break;
default:
alert(true);
}
mDirtyState = DIRTY_STATE_CLEAN;
}
void Panel::refresh(void *pParam)
{
RefreshParam *pRP = (RefreshParam*)pParam;
switch(pRP->flag & REFRESH_MASK)
{
case REFRESH_NONE:
break;
case REFRESH_UPPER:
if(pRP->pChanger == this)
{
pRP->flag = (pRP->flag & METHOD_MASK) | REFRESH_ALL;
BitBlt();
}
break;
case REFRESH_ALL:
BitBlt();
break;
default:
alert(true);
}
}
void Panel::drawControls(void)
{
list<Control*>::iterator itor;
for(itor = mControlList.begin(); itor != mControlList.end(); itor++)
(*itor)->reDraw();
}
void Panel::markDirty(void)
{
mDirtyState = DIRTY_MARK;
}
void Panel::BitBlt(void)
{
alert(mpWnd->gethMemDC() == NULL);
::BitBlt(mpWnd->gethMemDC(), mX, mY, mWidth, mHeight, mhMemDC, 0, 0, SRCCOPY);
}
DWORD WINAPI Panel::drawProc(LPVOID pParam)
{
Panel *pPnl = (Panel*)pParam;
pPnl->drawBkg();
pPnl->drawControls();
pPnl->markDirty();
CloseHandle(pPnl->mhDrawProc);
pPnl->mhDrawProc = NULL;
return EXIT_SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -