CWaitCursor wait; |
DWORD dwPos = ::GetMessagePos(); CPoint point(LOWORD(dwPos),HIWORD(dwPos)); ScreenToClient(&point); |
class CBufDC {
CBitmap bm;
CBitmap* pBmOld;
CDC dcMem;
CDC* pDC0;
CRect rct;
CBufDC(const CBufDC&);
public:
CBufDC(CView* pView,CDC* pDCorg) : pDC0(pDCorg) {
pView->GetClientRect(&rct);
dcMem.CreateCompatibleDC(pDC0);
bm.CreateCompatibleBitmap(pDC0,rct.Width(),rct.Height());
pBmOld = dcMem.SelectObject(&bm);
dcMem.FillSolidRect(&rct,pDC0->GetBkColor());
pView->OnPrepareDC(&dcMem);
}
~CBufDC() {
pDC0->DPtoLP(&rct);
pDC0->BitBlt(0,0,rct.Width(),
rct.Height(),&dcMem,0,0,SRCCOPY);
dcMem.SelectObject(pBmOld);
}
CDC* GetDC(){return &dcMem;}
};
void CXXXView::OnDraw(CDC* pDC0)
{
CBufDC dumy(this,pDC0);
CDC* pDC = dumy.GetDC();
|
// テキストのクリップボード
namespace ClipBoardText {
char* Get(){
if (!AfxGetMainWnd()->OpenClipboard()) return 0;
char* p = (char*)GetClipboardData(CF_TEXT);
CloseClipboard();
return p;
}
bool Set(const char* p0){
if (!AfxGetMainWnd()->OpenClipboard()) return false;
if (!EmptyClipboard()) return false;
HGLOBAL p = GlobalAlloc(GHND | GMEM_DDESHARE,strlen(p0)+1);
char* q = (char*)GlobalLock(p);
strcpy(q,p0);
GlobalUnlock(p);
if (!SetClipboardData(CF_TEXT,q)) {
GlobalFree(p);
CloseClipboard();
return false;
}
CloseClipboard();
return true;
}
}
|
起動時:[SDI] CMainFrame::PreCreateWindow() で、cs の cx,cy を変更する。 任意の場所:SetWindowPos() を使う。 |
CView:
OnPrepareDC() で
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(図のサイズ);
pDC->SetViewportExt(表示サイズ);
(注: サイズが32768を超える場合、図のサイズと表示のサイズを共に同じ値で割ればよい)
CScrollView:
OnPrepareDC() では、上のCViewと同じ。
論理領域が変更された時、(OnInitialUpdate or OnUpdate)
SetScrollSizes(MM_TEXT,表示サイズ);
|
// 論理値sx,syからtx,tyに矢印を書く
void DrawArrow(CDC* pDC,int sx,int sy,int tx,int ty,int siz)
{
int x = tx - sx, y = ty - sy;
double dx,dy,rx,ry, c = 0.4, r = sqrt(double(x)*x + double (y)*y);
pDC->MoveTo(sx,sy);
pDC->LineTo(tx,ty);
if (siz <= 0 || r < siz) return;
r = siz / r;
dx = rx = r*x;
dy = ry = r*y;
rx *= c;
ry *= c;
pDC->BeginPath();
pDC->LineTo(int(tx-dx-ry),int(ty-dy+rx));
pDC->LineTo(int(tx-dx+ry),int(ty-dy-rx));
pDC->EndPath();
CBrush* pbr = (CBrush*)pDC->SelectStockObject(BLACK_BRUSH);
pDC->FillPath();
pDC->SelectObject(pbr);
}
|
#pragma warning(disable:4786) |
CPoint g_pt;
void CBitmapTestView::OnDraw(CDC* pDC)
{
CBitmapTestDoc* pDoc = GetDocument();
CBitmap b1,b2,*p1,*p2;
BITMAP bm;
b1.LoadBitmap(IDB_BITMAP1);
b2.LoadBitmap(IDB_BITMAP2);
b1.GetBitmap(&bm);
CDC dc1,dc2;
dc1.CreateCompatibleDC(pDC);
dc2.CreateCompatibleDC(pDC);
p1 = dc1.SelectObject(&b1);
p2 = dc2.SelectObject(&b2);
CBrush br(HS_CROSS,RGB(200,255,200));
CRect r;
GetClientRect(&r);
pDC->FillRect(&r,&br);
pDC->BitBlt(g_pt.x,g_pt.y,bm.bmWidth,bm.bmHeight,&dc2,0,0,SRCAND);
pDC->BitBlt(g_pt.x,g_pt.y,bm.bmWidth,bm.bmHeight,&dc1,0,0,SRCPAINT);
dc1.SelectObject(p1);
dc2.SelectObject(p2);
}
void CBitmapTestView::OnLButtonDown(UINT nFlags, CPoint point)
{
g_pt = point;
Invalidate();
}
|
ListView_SetExtendedListViewStyle(list.m_hWnd,LVS_EX_FULLROWSELECT); |
void CXXXFormView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
} |
if (!CreateMutex(0,TRUE,AfxGetAppName()))
return FALSE;
if (GetLastError() == ERROR_ALREADY_EXISTS) {
HWND hWnd = ::FindWindow(0,AfxGetAppName());
if (hWnd) {
if (::IsIconic(hWnd))
::ShowWindow(hWnd,SW_RESTORE);
::SetForegroundWindow(::GetLastActivePopup(hWnd));
return FALSE;
}
}
|
// ショートカットの作成
bool CreateLinkFile(LPCTSTR sShcut,LPCTSTR sDesc,LPCTSTR sTarget)
{
bool ret = false;
HRESULT res;
IShellLink* psl;
CoInitialize(0);
res = CoCreateInstance(CLSID_ShellLink,0,
CLSCTX_INPROC_SERVER,IID_IShellLink,(void **)&psl);
if (SUCCEEDED(res)) {
IPersistFile* ppf;
res = psl->QueryInterface(IID_IPersistFile,(void **)&ppf);
if (SUCCEEDED(res)) {
if (SUCCEEDED(psl->SetPath(sTarget))) {
if (SUCCEEDED(psl->SetDescription(sDesc))) {
WCHAR wsShcut[MAX_PATH]; // Unicode 用のバッファ
MultiByteToWideChar(CP_ACP,0,sShcut,-1,wsShcut,MAX_PATH);
ret = SUCCEEDED(ppf->Save(wsShcut,TRUE));
}
}
ppf->Release();
}
psl->Release();
}
CoUninitialize();
return ret;
}
// ショートカット先の取得
bool GetShortcutLink(LPSTR sShcut,LPSTR sTarget,int mx)
{
bool ret = false;
HRESULT res;
IShellLink* psl;
WIN32_FIND_DATA wfd;
CoInitialize(0);
res = CoCreateInstance(CLSID_ShellLink,0,
CLSCTX_INPROC_SERVER,IID_IShellLink,(void **)&psl);
if (SUCCEEDED(res)) {
IPersistFile* ppf;
res = psl->QueryInterface(IID_IPersistFile,(void **)&ppf);
if (SUCCEEDED(res)) {
WCHAR wsShcut[MAX_PATH]; // Unicode 用のバッファ
MultiByteToWideChar(CP_ACP,0,sShcut,-1,wsShcut,MAX_PATH);
if (SUCCEEDED(ppf->Load(wsShcut,STGM_READ)))
ret = SUCCEEDED(psl->GetPath(sTarget,mx,&wfd,SLGP_UNCPRIORITY));
ppf->Release();
}
psl->Release();
}
CoUninitialize();
return ret;
} |
int CXXXApp::ExitInstance()
{
CWinApp::ExitInstance();
return m_retCode;
}
|
char buf[512]; SHFILEOPSTRUCT fo; fo.hwnd = m_hWnd; fo.wFunc = FO_DELETE; strcpy(buf,file); buf[strlen(buf)+1] = 0; fo.pFrom = buf; fo.pTo = 0; fo.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI; if (SHFileOperation(&fo)) AfxMessageBox(file + " を削除できません"); |
バッティングしていると、「落ちる」「違うハンドラが呼ばれる」「文字化けする」 「コンパイルできない」などの不具合があった。なかなか気づかないことも多い。 resource.h を編集したら、リビルドすること。 resource.h の値の編集には、「Altを押しながらの選択」とExcel が便利である。