📄 dibtcl.cpp
字号:
#include "DIBtcl.h"
#include <tkwinint.h>
CDibTcl::CDibTcl(const CString name,Tcl_Interp* interp,BOOL &ok,int w,int h) {
tclname=name;
tclinterp=interp;
void * pthn=(void *)LPCSTR(tclname);
tkwin=Tk_CreateWindowFromPath(tclinterp, Tk_MainWindow(interp),(char *)pthn, NULL);
Tk_GeometryRequest(tkwin, w, h);
Tk_MakeWindowExist(tkwin);
tk_hwnd=Tk_GetHWND(Tk_WindowId(tkwin));
_hdcDisplay = GetWindowDC(tk_hwnd);
ok=tk_hwnd?TRUE:FALSE;
AddDib(this);
_selfInit();
ok&=Open();
}
CDibTcl::~CDibTcl() {
if (_open) {
Close();
}
RemoveDib(this);
}
void CDibTcl::_selfInit() {
_hdrawdib=0;
_open=FALSE;
}
BOOL CDibTcl::Close() {
_open=FALSE;
if (_hdrawdib)
return DrawDibClose(_hdrawdib);
else
return FALSE;
}
BOOL CDibTcl::Open() {
if (_open) {
Close();
}
_hdrawdib=DrawDibOpen();
if (_hdrawdib) {
_open=TRUE;
} else {
_open=FALSE;
}
return _open;
}
CDibTcl::cell* CDibTcl::_allDIBs=0;
CDibTcl *CDibTcl::FindDib(const CString tclname) {
cell *c=_allDIBs;
while (c) {
if (c->dib->tclname==tclname) {
return c->dib;
}
c=c->suiv;
}
return NULL;
}
void CDibTcl::AddDib(CDibTcl* dib) {
_allDIBs=new cell(dib,_allDIBs);
}
void CDibTcl::RemoveDib(const CDibTcl *dib) {
cell *c=_allDIBs,*p=NULL;
while (c) {
if (c->dib==dib) {
if (p) {
p->suiv=c->suiv;
} else {
_allDIBs=c->suiv;
}
delete c;
return;
}
p=c;
c=c->suiv;
}
}
BOOL CDibTcl::BeginDIB(LPBITMAPINFO lpb,UINT wFlags) {
if (_open&&lpb) {
lpbi=lpb->bmiHeader;
bmpinfo=*lpb;
return DrawDibBegin(_hdrawdib,_hdcDisplay,Tk_Width(tkwin),Tk_Height(tkwin),&lpbi,
(UINT)lpbi.biWidth,(UINT)lpbi.biHeight, wFlags);
} else {
return FALSE;
}
}
BOOL CDibTcl::EndDIB() {
return DrawDibEnd(_hdrawdib);
}
BOOL CDibTcl::DrawDIB(LPVOID lpBits,UINT wFlags) {
if (_open&&lpBits) {
return DrawDibDraw(_hdrawdib,_hdcDisplay,0,0,Tk_Width(tkwin),Tk_Height(tkwin),
&lpbi,lpBits,0,0,(UINT)lpbi.biWidth,(UINT)lpbi.biHeight,wFlags);
} else {
return FALSE;
}
}
BOOL CDibTcl::Refresh() {
if (_open) {
return DrawDibUpdate(_hdrawdib,_hdcDisplay,0,0);
} else {
return FALSE;
}
}
CSize CDibTcl::GetSize() {
CSize s;
s.cx=Tk_Width(tkwin);
s.cy=Tk_Height(tkwin);
return s;
}
void CDibTcl::SetSize(CSize &s) {
Tk_ResizeWindow(tkwin, s.cx, s.cy);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -