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 が便利である。