WCECOMPAT_API int __cdecl wceWasMenuGesture(HWND hwnd, int x, int y, int button, int down, UINT flags) { #ifdef POCKETPC_MENUS SHRGINFO shrginfo; int result; static int doit = 0 ; shrginfo.cbSize = sizeof(SHRGINFO); shrginfo.hwndClient = hwnd; shrginfo.ptDown.x = x; shrginfo.ptDown.y = y; shrginfo.dwFlags = SHRG_RETURNCMD; NKDbgPrintfW(TEXT("entering recognize\n")); if (doit) { result = SHRecognizeGesture(&shrginfo); } NKDbgPrintfW(TEXT("got %d\n"), result); return (result);// SHRecognizeGesture(&shrginfo)); #else return 0; /* handled elsewhere, for now */ #endif }
void CDrawCtrl::OnLButtonDown(UINT nFlags, CPoint point) { #ifdef _WIN32_WCE if(SHRecognizeGesture(point)) { OnRButtonUp(nFlags, point); } #endif CClientDC dc(this); dc.DPtoLP(&point); m_pDraw = new CDesenho(); m_pDraw->m_pointArray.Add(point); SetCapture(); m_ptPrev = point; //CStatic::OnLButtonDown(nFlags, point); }
static LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { static int is_running = 0; HDC hdc; PAINTSTRUCT ps; #ifndef __MINGW32__ SHRGINFO rg; #endif int x, y; int i; switch(msg) { case WM_CREATE: if(hToolTip == NULL) { hToolTip = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG_TOOLTIP), NULL, ToolTipProc); } break; case WM_DESTROY: DestroyWindow(hToolTip); hToolTip = NULL; // FileListCnt = 0; return 0; case WM_TODAYCUSTOM_CLEARCACHE: break; case WM_TODAYCUSTOM_QUERYREFRESHCACHE: if(Refresh) { Refresh = FALSE; // compute screen extents for(x = WinLeftMargin, y = WinTopMargin, i = 0; i < FileListCnt; i++) { if((x + IconSizeX + (HMargin * 2)) > GetSystemMetrics(SM_CXSCREEN) - WinRightMargin) { x = WinLeftMargin; y += IconSizeY + (VMargin * 2); } x += IconSizeX + (HMargin * 2); } y += IconSizeY + (VMargin * 2) + WinBottomMargin; ((TODAYLISTITEM *)(wParam))->cyp = y; SetTimer(hWnd, ID_ICON_TIMER, ShowIconSec * 1000, NULL); return TRUE; } return FALSE; case WM_LBUTTONDOWN: SelItem = Point2Item(LOWORD(lParam), HIWORD(lParam)); InvalidateRect(hWnd, NULL, FALSE); UpdateWindow(hWnd); #ifndef __MINGW32__ rg.cbSize = sizeof(SHRGINFO); rg.hwndClient = hWnd; rg.ptDown.x = LOWORD(lParam); rg.ptDown.y = HIWORD(lParam); #ifdef _WCE_PPC2002 rg.dwFlags = SHRG_RETURNCMD | SHRG_NOANIMATION; #else rg.dwFlags = SHRG_RETURNCMD; #endif if(SelItem != -1 && SHRecognizeGesture(&rg) == GN_CONTEXTMENU) { RECT rect; RECT tip_rect; SendMessage(hToolTip, WM_SETTEXT, 0, (LPARAM)(FileList + SelItem)->Description); GetWindowRect(hWnd, &rect); GetWindowRect(hToolTip, &tip_rect); tip_rect.left = rect.left + LOWORD(lParam) - (tip_rect.right - tip_rect.left) - 10; if(tip_rect.left < 0) tip_rect.left = 0; tip_rect.top = rect.top + HIWORD(lParam) - (tip_rect.bottom - tip_rect.top) - 10; if(tip_rect.top < 0) tip_rect.top = 0; SetWindowPos(hToolTip, HWND_TOPMOST, tip_rect.left, tip_rect.top, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_SHOWWINDOW); } #endif SetCapture(hWnd); break; case WM_LBUTTONUP: ShowWindow(hToolTip, SW_HIDE); ReleaseCapture(); i = Point2Item(LOWORD(lParam), HIWORD(lParam)); if(i != -1 && i == SelItem) { if (!is_running) { is_running = 1; ShellOpen((FileList + i)->FileName, (FileList + i)->CommandLine); Sleep(1000); is_running = 0; } } SelItem = -1; InvalidateRect(hWnd, NULL, FALSE); UpdateWindow(hWnd); break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); OnPaint(hWnd, hdc, &ps); EndPaint(hWnd, &ps); break; case WM_ERASEBKGND: return 1; case WM_TIMER: switch(wParam) { case ID_ICON_TIMER: // JMW maybe break here? KillTimer(hWnd, ID_ICON_TIMER); InvalidateRect(hWnd, NULL, FALSE); UpdateWindow(hWnd); break; } break; default: return DefWindowProc(hWnd, msg, wParam, lParam); } return 0; }
LRESULT CALLBACK VirtualListView::WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { VirtualListView *p=(VirtualListView *) GetWindowLong(hWnd, GWL_USERDATA); int klav=0; switch (message) { case WM_CREATE: { p=(VirtualListView *) (((CREATESTRUCT *)lParam)->lpCreateParams); SetWindowLong(hWnd, GWL_USERDATA, (LONG) p ); //p->listScrollHWND=CreateWindow(_T("SCROLLBAR"), NULL, // SBS_VERT | WS_VISIBLE | WS_CHILD, // 0, 0, CW_USEDEFAULT, CW_USEDEFAULT, // hWnd, NULL, g_hInst, NULL); break; } case WM_PAINT: { PAINTSTRUCT ps; HDC hdc; HDC wnd; wnd = BeginPaint(hWnd, &ps); HBITMAP buf=CreateCompatibleBitmap(wnd, p->clientRect.right, p->clientRect.bottom); hdc=CreateCompatibleDC(NULL); SelectObject(hdc, buf); PatBlt(hdc, 0, 0, p->clientRect.right, p->clientRect.bottom, WHITENESS); // TODO: Add any drawing code here... SetBkMode(hdc, OPAQUE); int y=-p->winTop; int index=0; if (p->odrlist.get()) { ODRList::const_iterator i=p->odrlist->begin(); while (i!=p->odrlist->end()) { ODRRef odr=*i; i++; bool oddIndex=(index & 1) && p->colorInterleaving; index++; bool focused = (odr.get()==p->cursorPos.get()); RECT ritem={0, y, p->clientRect.right, y} ; odr->measure(hdc, ritem); //int iHeight=odr->getHeight(); //y+=iHeight; y=ritem.bottom; //index++; if (ritem.bottom < 0) continue; if (ritem.top > p->clientRect.bottom) continue; int bkColor=COLORS[12]; if (focused) { // focused item SetTextColor(hdc, COLORS[8]); bkColor=(GetFocus()==hWnd)?COLORS[9]:COLORS[10]; //DrawFocusRect(hdc, &ritem); } else { //usual item SetTextColor(hdc, odr->getColor()); bkColor= (oddIndex)? COLORS[11] : COLORS[12]; } HBRUSH bkBrush=CreateSolidBrush(bkColor); SetBkColor(hdc, bkColor); ritem.right=p->clientRect.right; //full window-wide cursor FillRect(hdc, &ritem, bkBrush); DeleteObject(bkBrush); odr->draw(hdc, ritem); } } RECT rc = {0, 0, 100, 100}; SCROLLINFO si; si.cbSize=sizeof(SCROLLINFO); si.fMask=SIF_PAGE |SIF_POS |SIF_RANGE; si.nPage=p->clientRect.bottom; si.nPos=p->winTop; si.nMin=0; si.nMax=y+p->winTop; SetScrollInfo(p->thisHWnd, SB_VERT, &si, TRUE); /*int titleBgnd=0x808080; HBRUSH tb=CreateSolidBrush(titleBgnd); SetBkColor(hdc, titleBgnd); SetTextColor(hdc, 0x000000); LPCTSTR t=p->title.c_str(); DrwText(hdc, t, -1, &rc, DT_CALCRECT | DT_LEFT | DT_TOP); rc.right=p->clientRect.right; FillRect(hdc, &rc, tb); DrwText(hdc, t, -1, &rc, DT_LEFT | DT_TOP); DeleteObject(tb);*/ BitBlt(wnd, 0,0,p->clientRect.right, p->clientRect.bottom, hdc, 0,0, SRCCOPY); DeleteDC(hdc); DeleteObject(buf); EndPaint(hWnd, &ps); break; } case WM_SIZE: { //HDWP hdwp; int height=GET_Y_LPARAM(lParam); int width=GET_X_LPARAM(lParam); // Calculate the display rectangle, assuming the // tab control is the size of the client area. SetRect(&(p->clientRect), 0, 0, width, height ); /*hdwp = BeginDeferWindowPos(1); DeferWindowPos(hdwp, p->listScrollHWND, HWND_TOP, width-SCROLLWIDTH, tabHeight, SCROLLWIDTH, height-tabHeight, SWP_NOZORDER ); EndDeferWindowPos(hdwp); */ p->cursorFit(); SCROLLINFO si; si.cbSize=sizeof(SCROLLINFO); si.fMask=SIF_PAGE |SIF_POS; si.nPage=height; si.nPos=p->winTop; SetScrollInfo(p->thisHWnd, SB_VERT, &si, TRUE); break; } case WM_LBUTTONDOWN: { SetFocus(hWnd); ODRRef focused=p->moveCursorTo(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); if (!(focused)) break; InvalidateRect(p->getHWnd(), NULL, true); SHRGINFO shrg; shrg.cbSize = sizeof(shrg); shrg.hwndClient = hWnd; shrg.ptDown.x = LOWORD(lParam); shrg.ptDown.y = HIWORD(lParam); shrg.dwFlags = SHRG_RETURNCMD /*| SHRG_NOANIMATION*/; if (SHRecognizeGesture(&shrg) == GN_CONTEXTMENU) { HMENU hmenu = p->getContextMenu(); VirtualListElement *velement=dynamic_cast<VirtualListElement *>(focused.get()); if (velement) hmenu=velement->getContextMenu(hmenu); if (hmenu==NULL) break; POINT pt={LOWORD(lParam), HIWORD(lParam) }; ClientToScreen(hWnd, &pt); int cmdId=TrackPopupMenuEx(hmenu, /*TPM_LEFTALIGN |*/ TPM_TOPALIGN | TPM_RETURNCMD, pt.x, pt.y, hWnd, NULL); bool cmdProcessed=false; if (velement) cmdProcessed=velement->OnMenuCommand(cmdId, p->getHWnd(), p->hEditBox); if (!cmdProcessed) p->OnCommand(cmdId, NULL); DestroyMenu(hmenu); } break; } case WM_LBUTTONDBLCLK: { ODRRef oldCursor=p->cursorPos; ODRRef focused=p->moveCursorTo(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); if (!(focused)) break; InvalidateRect(p->getHWnd(), NULL, true); if (focused==oldCursor) p->eventOk(); break; } case WM_SETFOCUS: case WM_KILLFOCUS: { InvalidateRect(p->getHWnd(), NULL, true); break; } case WM_KEYDOWN: {bool kl2=1; int vKey=(int)wParam; int lkeyData=lParam; if (lkeyData & 0x80000000) break; //keyRelease switch (vKey) { /* UFO START */ case VK_RIGHT: PostMessage(tabs->getHWnd(), WM_COMMAND, TabsCtrl::NEXTTAB, 0); break; case VK_3:kl2=0; // MessageBox(hWnd, TEXT("Clicked 3"), TEXT("!"), 0); SCROLLINFO si2; si2.cbSize=sizeof(SCROLLINFO); si2.fMask=SIF_ALL; GetScrollInfo(p->thisHWnd, SB_VERT, &si2); //TODO: flicker-free scrolling /* case SB_LINEDOWN: */// si2.nPos+=tabHeight; break; //case SB_LINEUP: si2.nPos-=tabHeight; //case SB_ENDSCROLL: break; /*//case SB_PAGEUP: */// si2.nPos-=si2.nPage; //case SB_PAGEDOWN: si2.nPos+=si2.nPage; break; if (si2.nPos<0) si2.nPos=0; if (si2.nPos+(int)si2.nPage >= si2.nMax) si2.nPos=si2.nMax-si2.nPage; p->winTop= si2.nPos; //TODO: flicker-free scrolling InvalidateRect(p->getHWnd(), NULL, true); si2.fMask=SIF_POS; SetScrollInfo(p->thisHWnd, SB_VERT, &si2, TRUE); break; case VK_9:kl2=0; SCROLLINFO si3; si3.cbSize=sizeof(SCROLLINFO); si3.fMask=SIF_ALL; GetScrollInfo(p->thisHWnd, SB_VERT, &si3); //TODO: flicker-free scrolling /* case SB_LINEDOWN: */// si3.nPos+=tabHeight; //case SB_LINEUP: si2.nPos-=tabHeight; //case SB_ENDSCROLL: break; /*//case SB_PAGEUP: */// si2.nPos-=si2.nPage; //case SB_PAGEDOWN: si2.nPos+=si2.nPage; break; if (si3.nPos<0) si3.nPos=0; if (si3.nPos+(int)si3.nPage >= si3.nMax) si3.nPos=si3.nMax-si3.nPage; p->winTop= si3.nPos; //TODO: flicker-free scrolling InvalidateRect(p->getHWnd(), NULL, true); si3.fMask=SIF_POS; SetScrollInfo(p->thisHWnd, SB_VERT, &si3, TRUE); break; // MessageBox(hWnd, TEXT("Clicked 3"), TEXT("!"), 0); case VK_LEFT: PostMessage(tabs->getHWnd(), WM_COMMAND, TabsCtrl::PREVTAB, 0); break; /* UFO END */ case VK_UP: p->moveCursor(-1); break; case VK_DOWN: p->moveCursor(1); break; case VK_RETURN: if (lkeyData &0xc0000000) break; p->eventOk(); break; } if(kl2)p->cursorFit(); InvalidateRect(p->getHWnd(), NULL, true); SCROLLINFO si; si.cbSize=sizeof(SCROLLINFO); si.nPos=p->winTop; si.fMask=SIF_POS; SetScrollInfo(p->thisHWnd, SB_VERT, &si, TRUE); break; } case WM_VSCROLL: { int scrollCode=(int)LOWORD(wParam); int nPos=(int)HIWORD(wParam); SCROLLINFO si; si.cbSize=sizeof(SCROLLINFO); si.fMask=SIF_ALL; GetScrollInfo(p->thisHWnd, SB_VERT, &si); //TODO: flicker-free scrolling switch (scrollCode) { case SB_LINEDOWN: si.nPos+=tabHeight; break; case SB_LINEUP: si.nPos-=tabHeight; break; case SB_ENDSCROLL: break; case SB_PAGEUP: si.nPos-=si.nPage; break; case SB_PAGEDOWN: si.nPos+=si.nPage; break; case SB_THUMBTRACK: case SB_THUMBPOSITION: si.nPos=si.nTrackPos; break; //default: si.nPos=si.nTrackPos; break; } if (si.nPos<0) si.nPos=0; if (si.nPos+(int)si.nPage >= si.nMax) si.nPos=si.nMax-si.nPage; p->winTop= si.nPos; //TODO: flicker-free scrolling InvalidateRect(p->getHWnd(), NULL, true); si.fMask=SIF_POS; SetScrollInfo(p->thisHWnd, SB_VERT, &si, TRUE); return true; } case WM_COMMAND: { int cmdId=LOWORD(wParam); p->OnCommand(cmdId, lParam); break; } case WM_VIRTUALLIST_REPLACE: { //TODO: create interconnecting message object to avoid pointers ODRListRef r=ODRListRef((ODRList *)lParam); p->bindODRList(r); //юурсмц ╧5 //p->bindODRList(ODRSet::ref((ODRSet *)lParam)); //юурсмц ╧3 p->notifyListUpdate(true); break; } case WM_DESTROY: //TODO: Destroy all child data associated eith this window return 0; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
LRESULT CALLBACK VirtualListView::WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { VirtualListView *p=(VirtualListView *) GetWindowLong(hWnd, GWL_USERDATA); int klav=0; lParamst=lParam; //printf(" \nmess: 0x%06X x:%d y:%d",message,GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam)); switch (message) { case WM_CREATE: { p=(VirtualListView *) (((CREATESTRUCT *)lParam)->lpCreateParams); SetWindowLong(hWnd, GWL_USERDATA, (LONG) p ); //p->listScrollHWND=CreateWindow(_T("SCROLLBAR"), NULL, // SBS_VERT | WS_VISIBLE | WS_CHILD, // 0, 0, CW_USEDEFAULT, CW_USEDEFAULT, // hWnd, NULL, g_hInst, NULL); break; } case CLEARMESS: {/*int result=MessageBox( p->getHWnd(), L"ќчистить окно от сообщений?", L"ќчистить", MB_YESNO | MB_ICONWARNING);*/ PostMessage(p->parentHWnd, CLEARMESS, NULL, false);} case WM_PAINT: { PAINTSTRUCT ps; HDC hdc; HDC wnd; wnd = BeginPaint(hWnd, &ps); HBITMAP buf=CreateCompatibleBitmap(wnd, p->clientRect.right, p->clientRect.bottom); hdc=CreateCompatibleDC(NULL); SelectObject(hdc, buf); PatBlt(hdc, 0, 0, p->clientRect.right, p->clientRect.bottom, WHITENESS); // TODO: Add any drawing code here... SetBkMode(hdc, OPAQUE); int y=-p->winTop; int index=0; if (p->odrlist.get()) { ODRList::const_iterator i=p->odrlist->begin(); while (i!=p->odrlist->end()) { ODRRef odr=*i; i++; bool oddIndex=(index & 1) && p->colorInterleaving; index++; bool focused = (odr.get()==p->cursorPos.get()); RECT ritem={0, y, p->clientRect.right, y} ; odr->measure(hdc, ritem); //int iHeight=odr->getHeight(); //y+=iHeight; y=ritem.bottom; //index++; if (ritem.bottom < 0) continue; if (ritem.top > p->clientRect.bottom) continue; int bkColor=COLORS[12]; if (focused) { // focused item SetTextColor(hdc, COLORS[8]); bkColor=(GetFocus()==hWnd)?COLORS[9]:COLORS[10]; //DrawFocusRect(hdc, &ritem); } else { //usual item SetTextColor(hdc, odr->getColor()); bkColor= (oddIndex)? COLORS[11] : COLORS[12]; } HBRUSH bkBrush=CreateSolidBrush(bkColor); SetBkColor(hdc, bkColor); ritem.right=p->clientRect.right; //full window-wide cursor FillRect(hdc, &ritem, bkBrush); DeleteObject(bkBrush); odr->draw(hdc, ritem,1); } } RECT rc = {0, 0, 100, 100}; SCROLLINFO si; si.cbSize=sizeof(SCROLLINFO); si.fMask=SIF_PAGE |SIF_POS |SIF_RANGE; si.nPage=p->clientRect.bottom; si.nPos=p->winTop; si.nMin=0; si.nMax=y+p->winTop; SetScrollInfo(p->thisHWnd, SB_VERT, &si, TRUE); /*int titleBgnd=0x808080; HBRUSH tb=CreateSolidBrush(titleBgnd); SetBkColor(hdc, titleBgnd); SetTextColor(hdc, 0x000000); LPCTSTR t=p->title.c_str(); DrwText(hdc, t, -1, &rc, DT_CALCRECT | DT_LEFT | DT_TOP); rc.right=p->clientRect.right; FillRect(hdc, &rc, tb); DrwText(hdc, t, -1, &rc, DT_LEFT | DT_TOP); DeleteObject(tb);*/ BitBlt(wnd, 0,0,p->clientRect.right, p->clientRect.bottom, hdc, 0,0, SRCCOPY); DeleteDC(hdc); DeleteObject(buf); EndPaint(hWnd, &ps); break; } case WM_SIZE: { //HDWP hdwp; int height=GET_Y_LPARAM(lParam); int width=GET_X_LPARAM(lParam); // Calculate the display rectangle, assuming the // tab control is the size of the client area. SetRect(&(p->clientRect), 0, 0, width, height ); /*hdwp = BeginDeferWindowPos(1); DeferWindowPos(hdwp, p->listScrollHWND, HWND_TOP, width-SCROLLWIDTH, tabHeight, SCROLLWIDTH, height-tabHeight, SWP_NOZORDER ); EndDeferWindowPos(hdwp); */ p->cursorFit(); SCROLLINFO si; si.cbSize=sizeof(SCROLLINFO); si.fMask=SIF_PAGE |SIF_POS; si.nPage=height; si.nPos=p->winTop; SetScrollInfo(p->thisHWnd, SB_VERT, &si, TRUE); break; } case MSGListFocus: { SetFocus(hWnd); break; } case WM_LBUTTONDOWN: { smile_aktiv=40; xmouse=GET_X_LPARAM(lParam); ymouse=GET_Y_LPARAM(lParam); movemode=0;//неопределили пока zaderzhka=0; xmouse_d=0; ymouse_d=0; taptrue=1; if(movetrue){break;} SetFocus(hWnd); ODRRef focused=p->moveCursorTo(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); if (!(focused)) break; InvalidateRect(p->getHWnd(), NULL, true); SHRGINFO shrg; shrg.cbSize = sizeof(shrg); shrg.hwndClient = hWnd; shrg.ptDown.x = LOWORD(lParam); shrg.ptDown.y = HIWORD(lParam); shrg.dwFlags = SHRG_RETURNCMD /*| SHRG_NOANIMATION*/; if (SHRecognizeGesture(&shrg) == GN_CONTEXTMENU) { HMENU hmenu = p->getContextMenu(); VirtualListElement *velement=dynamic_cast<VirtualListElement *>(focused.get()); if (velement) hmenu=velement->getContextMenu(hmenu); if (hmenu==NULL) break; POINT pt={LOWORD(lParam), HIWORD(lParam) }; ClientToScreen(hWnd, &pt); int cmdId=TrackPopupMenuEx(hmenu, /*TPM_LEFTALIGN |*/ TPM_TOPALIGN | TPM_RETURNCMD, pt.x, pt.y, hWnd, NULL); bool cmdProcessed=false; if (velement) cmdProcessed=velement->OnMenuCommand(cmdId, p->getHWnd(), p->hEditBox); if (!cmdProcessed) p->OnCommand(cmdId, NULL); DestroyMenu(hmenu); }else{ //нажатие на иконки p->is_icon_klik(xmouse); } break; } case WM_LBUTTONDBLCLK: { smile_aktiv=40 ; ODRRef oldCursor=p->cursorPos; ODRRef focused=p->moveCursorTo(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); if (!(focused)) break; InvalidateRect(p->getHWnd(), NULL, true); if (focused==oldCursor) p->eventOk(); break; } case WM_SETFOCUS: case WM_KILLFOCUS: { InvalidateRect(p->getHWnd(), NULL, true); break; } case WM_MOUSEMOVE: {//скролл тасканием //movetrue=1; smile_aktiv=40 ; if(zaderzhka>0){ printf("mode %d X: %d Y: %d\n",movemode,xmouse_d,ymouse_d); if(movemode){ //собственно само движение if(movemode==1){ //верт if(ymouse_d<0){ PostMessage(p->getHWnd(), WM_VSCROLL, SB_LINEDOWN, 0); //PostMessage(p->getHWnd(), WM_VSCROLL, SB_LINEDOWN, 0); }else{ PostMessage(p->getHWnd(), WM_VSCROLL, SB_LINEUP, 0); // PostMessage(p->getHWnd(), WM_VSCROLL, SB_LINEUP, 0); } }else{ //гориз if (abs(xmouse_d)>50){ if (xmouse_d<0){ PostMessage(tabs->getHWnd(), WM_COMMAND, TabsCtrl::NEXTTAB, 0);} else{PostMessage(tabs->getHWnd(), WM_COMMAND, TabsCtrl::PREVTAB, 0);} xmouse_d=0; }} } else //определ¤ем movemode 1-вертик 2-гориз {int absx,absy; absx=xmouse_d;absy=ymouse_d; if(xmouse_d<0)absx=xmouse_d*(-1); if(ymouse_d<0)absy=ymouse_d*(-1); if(absx > absy){movemode=2;}else{movemode=1;} movetrue=1;taptrue=0; printf("mode %d ax: %d ay: %d\n",movemode,absx,absy); } zaderzhka=0;ymouse_d=0; }else{zaderzhka++; xmouse_d=xmouse_d+GET_X_LPARAM(lParam)-xmouse; ymouse_d=ymouse_d+GET_Y_LPARAM(lParam)- ymouse; xmouse=GET_X_LPARAM(lParam); ymouse=GET_Y_LPARAM(lParam); } break;} case WM_LBUTTONUP: {if(movetrue==1 && taptrue==1){ movetrue=0; PostMessage(p->getHWnd(), WM_LBUTTONDOWN, 0, lParamst); } break; } case WM_KEYDOWN: {bool kl2=1; smile_aktiv=40 ; int vKey=(int)wParam; int lkeyData=lParam; if (lkeyData & 0x80000000) break; //keyRelease switch (vKey) { /* UFO START */ case VK_5: { ODRRef focused=p->cursorPos; if (!(focused)) break; InvalidateRect(p->getHWnd(), NULL, true); HMENU hmenu = p->getContextMenu(); VirtualListElement *velement=dynamic_cast<VirtualListElement *>(focused.get()); if (velement) hmenu=velement->getContextMenu(hmenu); if (hmenu==NULL) break; POINT pt={LOWORD(lParam), HIWORD(lParam) }; ClientToScreen(hWnd, &pt); int cmdId=TrackPopupMenuEx(hmenu, /*TPM_LEFTALIGN |*/ TPM_TOPALIGN | TPM_RETURNCMD, pt.x, pt.y, hWnd, NULL); bool cmdProcessed=false; if (velement) cmdProcessed=velement->OnMenuCommand(cmdId, p->getHWnd(), p->hEditBox); if (!cmdProcessed) p->OnCommand(cmdId, NULL); DestroyMenu(hmenu); break; } case VK_RIGHT: PostMessage(tabs->getHWnd(), WM_COMMAND, TabsCtrl::NEXTTAB, 0); break; case VK_3:kl2=0; // MessageBox(hWnd, TEXT("Clicked 3"), TEXT("!"), 0); SCROLLINFO si2; si2.cbSize=sizeof(SCROLLINFO); si2.fMask=SIF_ALL; GetScrollInfo(p->thisHWnd, SB_VERT, &si2); //TODO: flicker-free scrolling /* case SB_LINEDOWN: */// si2.nPos+=tabHeight; break; //case SB_LINEUP: si2.nPos-=tabHeight; //case SB_ENDSCROLL: break; /*//case SB_PAGEUP: */// si2.nPos-=si2.nPage; //case SB_PAGEDOWN: si2.nPos+=si2.nPage; break; if (si2.nPos<0) si2.nPos=0; if (si2.nPos+(int)si2.nPage >= si2.nMax) si2.nPos=si2.nMax-si2.nPage; p->winTop= si2.nPos; //TODO: flicker-free scrolling InvalidateRect(p->getHWnd(), NULL, true); si2.fMask=SIF_POS; SetScrollInfo(p->thisHWnd, SB_VERT, &si2, TRUE); break; case VK_9:kl2=0; SCROLLINFO si3; si3.cbSize=sizeof(SCROLLINFO); si3.fMask=SIF_ALL; GetScrollInfo(p->thisHWnd, SB_VERT, &si3); //TODO: flicker-free scrolling /* case SB_LINEDOWN: */// si3.nPos+=tabHeight; //case SB_LINEUP: si2.nPos-=tabHeight; //case SB_ENDSCROLL: break; /*//case SB_PAGEUP: */// si2.nPos-=si2.nPage; //case SB_PAGEDOWN: si2.nPos+=si2.nPage; break; if (si3.nPos<0) si3.nPos=0; if (si3.nPos+(int)si3.nPage >= si3.nMax) si3.nPos=si3.nMax-si3.nPage; p->winTop= si3.nPos; //TODO: flicker-free scrolling InvalidateRect(p->getHWnd(), NULL, true); si3.fMask=SIF_POS; SetScrollInfo(p->thisHWnd, SB_VERT, &si3, TRUE); break; // MessageBox(hWnd, TEXT("Clicked 3"), TEXT("!"), 0); case VK_LEFT: PostMessage(tabs->getHWnd(), WM_COMMAND, TabsCtrl::PREVTAB, 0); break; /* UFO END */ case VK_UP: p->moveCursor(-1); break; case VK_DOWN: /* UFO START */ // переключаем фокус в поле ввода после второго нажати¤ кнопки вниз на последнем сообщении if (p->cursorAtEnd() && IsWindow(p->hEditBox) ) SetFocus(p->hEditBox); /* UFO END */ p->moveCursor(1); break; case VK_RETURN: SHRGINFO shrg; shrg.cbSize = sizeof(shrg); shrg.hwndClient = hWnd; shrg.ptDown.x = LOWORD(lParam); shrg.ptDown.y = HIWORD(lParam); shrg.dwFlags = SHRG_RETURNCMD | SHRG_NOANIMATION; if (SHRecognizeGesture(&shrg) == GN_CONTEXTMENU) { ODRRef focused=p->cursorPos; if (!(focused)) break; InvalidateRect(p->getHWnd(), NULL, true); HMENU hmenu = p->getContextMenu(); VirtualListElement *velement=dynamic_cast<VirtualListElement *>(focused.get()); if (velement) hmenu=velement->getContextMenu(hmenu); if (hmenu==NULL) break; POINT pt={LOWORD(lParam), HIWORD(lParam) }; ClientToScreen(hWnd, &pt); int cmdId=TrackPopupMenuEx(hmenu, /*TPM_LEFTALIGN |*/ TPM_TOPALIGN | TPM_RETURNCMD, pt.x, pt.y, hWnd, NULL); bool cmdProcessed=false; if (velement) cmdProcessed=velement->OnMenuCommand(cmdId, p->getHWnd(), p->hEditBox); if (!cmdProcessed) p->OnCommand(cmdId, NULL); DestroyMenu(hmenu); break; } if (lkeyData &0xc0000000) break; p->eventOk(); break; } if(kl2)p->cursorFit(); InvalidateRect(p->getHWnd(), NULL, true); SCROLLINFO si; si.cbSize=sizeof(SCROLLINFO); si.nPos=p->winTop; si.fMask=SIF_POS; SetScrollInfo(p->thisHWnd, SB_VERT, &si, TRUE); break; } case WM_VSCROLL: { smile_aktiv=40 ; int scrollCode=(int)LOWORD(wParam); int nPos=(int)HIWORD(wParam); SCROLLINFO si; si.cbSize=sizeof(SCROLLINFO); si.fMask=SIF_ALL; GetScrollInfo(p->thisHWnd, SB_VERT, &si); //TODO: flicker-free scrolling switch (scrollCode) { case SB_LINEDOWN: si.nPos+=tabHeight; break; case SB_LINEUP: si.nPos-=tabHeight; break; case SB_ENDSCROLL: break; case SB_PAGEUP: si.nPos-=si.nPage; break; case SB_PAGEDOWN: si.nPos+=si.nPage; break; case SB_THUMBTRACK: case SB_THUMBPOSITION: si.nPos=si.nTrackPos; break; //default: si.nPos=si.nTrackPos; break; } if (si.nPos<0) si.nPos=0; if (si.nPos+(int)si.nPage >= si.nMax) si.nPos=si.nMax-si.nPage; p->winTop= si.nPos; //TODO: flicker-free scrolling InvalidateRect(p->getHWnd(), NULL, true); si.fMask=SIF_POS; SetScrollInfo(p->thisHWnd, SB_VERT, &si, TRUE); return true; } case WM_COMMAND: { int cmdId=LOWORD(wParam); p->OnCommand(cmdId, lParam); break; } case WM_VIRTUALLIST_REPLACE: { //TODO: create interconnecting message object to avoid pointers ODRListRef r=ODRListRef((ODRList *)lParam); p->bindODRList(r); //ј’“”Ќ√ є5 //p->bindODRList(ODRSet::ref((ODRSet *)lParam)); //ј’“”Ќ√ є3 p->notifyListUpdate(true); break; } case WM_DESTROY: //TODO: Destroy all child data associated eith this window return 0; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
LRESULT CALLBACK ChessView::WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) {int cvtp=1;int figura;RECT rc2;BOOL postv;BOOL postvput; rc2.left=rc2.top=0; rc2.bottom=rc2.right=8*RAZMER+2; PAINTSTRUCT ps; HDC hdc; HDC hdc2; int xf,yf;//для постановки-куда предпологаем ставить int z;int z2; ChessView *p=(ChessView *) GetWindowLong(hWnd, GWL_USERDATA); switch (message) {case WM_CLOSE: case WM_DESTROY: DeleteObject(hBmp1);//Удалим DeleteDC(hMemDC1); case WM_CREATE: p=(ChessView *) (((CREATESTRUCT *)lParam)->lpCreateParams); SetWindowLong(hWnd, GWL_USERDATA, (LONG) p ); break; case WM_PAINT: // тута рисовать cvtp=1; hdc=GetDC(hWnd);//Получим HDC //hdc = BeginPaint(hWnd, &ps); hMemDC1=CreateCompatibleDC(hdc); hBmp1=CreateCompatibleBitmap(hdc,rc2.bottom,rc2.bottom); SelectObject(hMemDC1,hBmp1); for(int x=1;x<=8;x++){ for(int y=1;y<=8;y++){ if(cvtp==1){ TransparentImage(hMemDC1,(x-1)*RAZMER,(y-1)*RAZMER,RAZMER,RAZMER, bmpc, 13*RAZMERSKIN, 0, RAZMERSKIN, RAZMERSKIN, transparentColorCH);}else{TransparentImage(hMemDC1,(x-1)*RAZMER,(y-1)*RAZMER,RAZMER,RAZMER, bmpc, 14*RAZMERSKIN, 0, RAZMERSKIN, RAZMERSKIN, transparentColorCH);} if(cvtp==2){cvtp=1;}else{cvtp=2;}//рисуем квадрат //рисуем фигуру if(p->Chesspole[y][x]>6){figura=p->Chesspole[y][x]-4;}else{figura=p->Chesspole[y][x];} TransparentImage(hMemDC1,(x-1)*RAZMER,(y-1)*RAZMER,RAZMER,RAZMER, bmpc, figura*RAZMERSKIN, 0, RAZMERSKIN, RAZMERSKIN, transparentColorCH); if(p->flagaktiv==1 && p->fokus_x==x && p->fokus_y==y){TransparentImage(hMemDC1,(x-1)*RAZMER,(y-1)*RAZMER,RAZMER,RAZMER, bmpc, 15*RAZMERSKIN, 0, RAZMERSKIN, RAZMERSKIN, transparentColorCH);} } if(cvtp==2){cvtp=1;}else{cvtp=2;} } hdc2 = BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); BitBlt(hdc,0,0,rc2.bottom,rc2.bottom,hMemDC1,0,0,SRCCOPY);//Скопируем рисунок из памяти // EndPaint(hWnd, &ps); break; case IDC_WM_VYBOR:{ p->fokus_x=(p->pt2.x)/RAZMER+1; p->fokus_y=(p->pt2.y)/RAZMER+1; p->fokus_f=p->Chesspole[p->fokus_y][p->fokus_x]; p->flagaktiv=1;//нажали if(p->fokus_f==0)p->flagaktiv=0; InvalidateRect(hWnd,&rc2,1); PostMessage (hWnd, WM_PAINT, 0, 0); // UpdateWindow(hWnd); } break; case IDC_WM_STAV: xf=(p->pt2.x)/RAZMER+1; yf=(p->pt2.y)/RAZMER+1; postvput=0; postv=0; if(p->fokus_f<7 && (p->Chesspole[yf][xf]>=7 || p->Chesspole[yf][xf]==0))postv=1;//на чужие или пусто if(p->fokus_f>6 && (p->Chesspole[yf][xf]<=6))postv=1; if(postv){//тут обрабатываем правильность хода в зависимости от фигуры if(p->fokus_f==1){postvput=0;//пешка if(p->fokus_y==7){//перепрыгнем на 2 вначале if(yf==5 && p->fokus_x==xf && p->Chesspole[6][xf]==0 && p->Chesspole[5][xf]==0){postvput=1;}else if(yf==6 && p->fokus_x==xf && p->Chesspole[6][xf]==0){postvput=1;}// }else{//на 1вперёд if(yf==p->fokus_y-1 && p->fokus_x==xf && p->Chesspole[yf][xf]==0){postvput=1;}//вперед на фигуру не идём if(yf==p->fokus_y-1 && (p->fokus_x==xf-1 || p->fokus_x==xf+1) && p->Chesspole[yf][xf]>6)postvput=1;//бьём на искось } //пешка-end }else if(p->fokus_f==11){postvput=0;//чёрнпешка if(p->fokus_y==2){//перепрыгнем на 2 вначале if(yf==4 && p->fokus_x==xf && p->Chesspole[3][xf]==0 && p->Chesspole[4][xf]==0){postvput=1;}else if(yf==3 && p->fokus_x==xf){postvput=1;}// }else{//на 1вперёд if(yf==p->fokus_y+1 && p->fokus_x==xf && p->Chesspole[yf][xf]==0){postvput=1;}//вперед на фигуру не идём if(yf==p->fokus_y+1 && (p->fokus_x==xf-1 || p->fokus_x==xf+1) && p->Chesspole[yf][xf]<7)postvput=1;//бьём на искось } //чёрнпешка-end }else if(p->fokus_f==2 || p->fokus_f==12){//тура if(yf==p->fokus_y){postvput=1;//горизонталь if(xf>p->fokus_x){//вправо for(z=p->fokus_x+1;z<xf;z++){if(p->Chesspole[yf][z]!=0)postvput=0;}}else if(xf<p->fokus_x){//ВЛЕВО for(z=p->fokus_x-1;z>xf;z--){if(p->Chesspole[yf][z]!=0)postvput=0;}} }else if(xf==p->fokus_x){postvput=1;//ВЕРТИКАЛЬ if(yf>p->fokus_y){//ВВЕРХ for(z=p->fokus_y+1;z<yf;z++){if(p->Chesspole[z][xf]!=0)postvput=0;}}else if(yf<p->fokus_y){//ВНИЗ for(z=p->fokus_y-1;z>yf;z--){if(p->Chesspole[z][xf]!=0)postvput=0;}} } //тура-end }else if(p->fokus_f==3 || p->fokus_f==13){//конь if(xf==p->fokus_x-2 && yf==p->fokus_y-1)postvput=1; if(xf==p->fokus_x-1 && yf==p->fokus_y-2)postvput=1; if(xf==p->fokus_x+1 && yf==p->fokus_y-2)postvput=1; if(xf==p->fokus_x+2 && yf==p->fokus_y-1)postvput=1; if(xf==p->fokus_x+2 && yf==p->fokus_y+1)postvput=1; if(xf==p->fokus_x+1 && yf==p->fokus_y+2)postvput=1; if(xf==p->fokus_x-1 && yf==p->fokus_y+2)postvput=1; if(xf==p->fokus_x-2 && yf==p->fokus_y+1)postvput=1; //конь-конец }else if(p->fokus_f==4 || p->fokus_f==14){//слон if(abs(p->fokus_x-xf)==abs(p->fokus_y-yf)){postvput=1; z2=0; if(p->fokus_x<xf){//право for(z=p->fokus_x+1;z<xf;z++){ if(p->fokus_y<yf && p->Chesspole[p->fokus_y+1+z2][z]!=0){postvput=0;} else if(p->fokus_y>yf && p->Chesspole[p->fokus_y-1-z2][z]!=0){postvput=0;} ++z2; } }else if(p->fokus_x>xf){ for(z=p->fokus_x-1;z>xf;z--){ if(p->fokus_y<yf && p->Chesspole[p->fokus_y+1+z2][z]!=0){postvput=0;} else if(p->fokus_y>yf && p->Chesspole[p->fokus_y-1-z2][z]!=0){postvput=0;} ++z2; } }} //слон-конец }else if(p->fokus_f==5 || p->fokus_f==15){//ферзь //как слон if(abs(p->fokus_x-xf)==abs(p->fokus_y-yf)){postvput=1; z2=0; if(p->fokus_x<xf){//право for(z=p->fokus_x+1;z<xf;z++){ if(p->fokus_y<yf && p->Chesspole[p->fokus_y+1+z2][z]!=0){postvput=0;} else if(p->fokus_y>yf && p->Chesspole[p->fokus_y-1-z2][z]!=0){postvput=0;} ++z2; } }else if(p->fokus_x>xf){ for(z=p->fokus_x-1;z>xf;z--){ if(p->fokus_y<yf && p->Chesspole[p->fokus_y+1+z2][z]!=0){postvput=0;} else if(p->fokus_y>yf && p->Chesspole[p->fokus_y-1-z2][z]!=0){postvput=0;} ++z2; } }}else{ //или тура if(yf==p->fokus_y){postvput=1;//горизонталь if(xf>p->fokus_x){//вправо for(z=p->fokus_x+1;z<xf;z++){if(p->Chesspole[yf][z]!=0)postvput=0;}}else if(xf<p->fokus_x){//ВЛЕВО for(z=p->fokus_x-1;z>xf;z--){if(p->Chesspole[yf][z]!=0)postvput=0;}} }else if(xf==p->fokus_x){postvput=1;//ВЕРТИКАЛЬ if(yf>p->fokus_y){//ВВЕРХ for(z=p->fokus_y+1;z<yf;z++){if(p->Chesspole[z][xf]!=0)postvput=0;}}else if(yf<p->fokus_y){//ВНИЗ for(z=p->fokus_y-1;z>yf;z--){if(p->Chesspole[z][xf]!=0)postvput=0;}} }} //конец ферз }else if(p->fokus_f==6 || p->fokus_f==16){postvput=0;//король if(abs(yf-p->fokus_y)==1 || abs(p->fokus_x-xf)==1){postvput=1; if(p->fokus_f==6)p->rocb=4; if(p->fokus_f==16)p->rokch=4; }//тут будет рокоровка else if() //конец король } } //поставили if( postvput){ p->Chesspole[p->fokus_y][p->fokus_x]=0; p->fokus_x=(p->pt2.x)/RAZMER+1; p->fokus_y=(p->pt2.y)/RAZMER+1; p->Chesspole[p->fokus_y][p->fokus_x]=p->fokus_f; } //UpdateWindow(hWnd);// InvalidateRect(hWnd,&rc2,1); PostMessage (hWnd, WM_PAINT,0 , 0); p->flagaktiv=0; break; case WM_LBUTTONDOWN: SetFocus(hWnd); SHRGINFO shrg; shrg.cbSize = sizeof(shrg); shrg.hwndClient = hWnd; shrg.ptDown.x = LOWORD(lParam); shrg.ptDown.y = HIWORD(lParam); shrg.dwFlags = SHRG_RETURNCMD /*| SHRG_NOANIMATION*/; if (SHRecognizeGesture(&shrg) == GN_CONTEXTMENU) { HMENU hmenu = CreatePopupMenu(); if (hmenu==NULL) break; if(p->flagaktiv==0)AppendMenu(hmenu, MF_STRING, WM_VYBOR, TEXT("Выбрать") ); if(p->flagaktiv==1){AppendMenu(hmenu, MF_STRING, WM_STAV, TEXT("Поставить") ); AppendMenu(hmenu, MF_STRING, WM_OTMENA_VYBOR, TEXT("Отмена выбора") );} AppendMenu(hmenu, MF_SEPARATOR, 0, NULL); AppendMenu(hmenu, MF_STRING, EM_UNDO, TEXT("Отмена") ); AppendMenu(hmenu, MF_STRING, SB_, TEXT("Пригласить") ); AppendMenu(hmenu, MF_STRING, SB_, TEXT("Сдаться") ); AppendMenu(hmenu, MF_STRING, SB_, TEXT("Ничья") ); POINT pt; p->pt2.x=GET_X_LPARAM(lParam); p->pt2.y=GET_Y_LPARAM(lParam); pt.x=GET_X_LPARAM(lParam); pt.y=GET_Y_LPARAM(lParam); ClientToScreen(hWnd, &pt); int cmdId=TrackPopupMenuEx(hmenu, TPM_BOTTOMALIGN | TPM_RETURNCMD, pt.x, pt.y, hWnd, NULL); if (cmdId==WM_VYBOR)PostMessage(hWnd, IDC_WM_VYBOR,0 , 0); if (cmdId==WM_STAV)PostMessage(hWnd, IDC_WM_STAV,0 , 0); return 0; } break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
long WINAPI ComboSubClassProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { WNDPROC OldWndProc=(WNDPROC) GetWindowLong(hWnd, GWL_USERDATA); switch(msg) { case WM_LBUTTONDOWN: { SHRGINFO shrg; shrg.cbSize = sizeof(shrg); shrg.hwndClient = hWnd; shrg.ptDown.x = LOWORD(lParam); shrg.ptDown.y = HIWORD(lParam); shrg.dwFlags = SHRG_RETURNCMD /*| SHRG_NOANIMATION*/; if (SHRecognizeGesture(&shrg) == GN_CONTEXTMENU) { DWORD sel=SendMessage(hWnd, EM_GETSEL, 0, 0); UINT paste = (IsClipboardFormatAvailable(CF_UNICODETEXT))? MF_STRING : MF_STRING | MF_GRAYED; UINT cut = (LOWORD(sel)!=HIWORD(sel))? MF_STRING : MF_STRING | MF_GRAYED; UINT undo= (SendMessage(hWnd, EM_CANUNDO, 0, 0))? MF_STRING : MF_STRING | MF_GRAYED;; HMENU hmenu = CreatePopupMenu(); if (hmenu==NULL) break; //AppendMenu(hmenu, (smileParser->hasSmiles())? MF_STRING : MF_STRING | MF_GRAYED, WM_USER, TEXT("Add Smile")); //AppendMenu(hmenu, MF_SEPARATOR, 0, NULL); AppendMenu(hmenu, cut, WM_CUT, TEXT("Cut") ); AppendMenu(hmenu, cut, WM_COPY, TEXT("Copy") ); AppendMenu(hmenu, paste, WM_PASTE, TEXT("Paste") ); AppendMenu(hmenu, MF_SEPARATOR, 0, NULL); AppendMenu(hmenu, undo, EM_UNDO, TEXT("Undo") ); POINT pt={LOWORD(lParam), HIWORD(lParam) }; ClientToScreen(hWnd, &pt); int cmdId=TrackPopupMenuEx(hmenu, TPM_BOTTOMALIGN | TPM_RETURNCMD, pt.x, pt.y, hWnd, NULL); //if (cmdId==WM_USER) SmileBox::showSmileBox(hWnd, pt.x, pt.y, smileParser); DestroyMenu(hmenu); if (cmdId>0) PostMessage(hWnd, cmdId, 0, 0); return 0; } break; } /*case WM_KEYDOWN: if (wParam==VK_CONTROL) editbox::editBoxShifts=true; if (wParam==VK_SHIFT) editbox::editBoxShifts=true; break; case WM_KEYUP: editbox::editBoxShifts=false; break; */ case WM_CHAR: if (wParam==VK_RETURN) { PostMessage(GetParent(GetParent(hWnd)), WM_COMMAND, IDOK, 0); return 0; } break; } return CallWindowProc(OldWndProc,hWnd,msg,wParam,lParam); }
LRESULT CALLBACK TabsCtrl::WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { PAINTSTRUCT ps; HDC hdc; TabsCtrl *p=(TabsCtrl *) GetWindowLong(hWnd, GWL_USERDATA); switch (message) { case WM_CREATE: { p=(TabsCtrl *) (((CREATESTRUCT *)lParam)->lpCreateParams); SetWindowLong(hWnd, GWL_USERDATA, (LONG) p ); p->tabScrollHWnd=CreateWindow(_T("SCROLLBAR"), NULL, /*SBS_TOPALIGN |*/ SBS_HORZ | WS_VISIBLE | WS_CHILD, 0, 0, CW_USEDEFAULT, CW_USEDEFAULT, hWnd, NULL, g_hInst, NULL); //dropdownWnd=DoCreateComboControl(hWnd); //ShowWindow(p->getListBoxHWnd(), SW_SHOW); break; } case CLEARMESS: {int result=MessageBox( p->getHWnd(), L"ќчистить лог?", L"ќчистить", MB_YESNO | MB_ICONWARNING); if (result==IDYES) Log::getInstance()->delet(); //if (result==IDYES) { // p->contact->messageList->clear(); // p->msgList->moveCursorEnd(); } break; case WM_PAINT: { hdc = BeginPaint(hWnd, &ps); /*if (p->makeTabLayout) { p->tabDoLayout(hdc); }*/ unsigned int activeTab=p->activeTab; for (unsigned int i=0; i < p->tabs.size(); i++) { if (i != activeTab) drawTab(hdc, p->xOffset, p->tabs[i], false); } int width=p->clientRect.right; HGDIOBJ old=SelectObject(hdc, GetStockObject(BLACK_PEN)); MoveToEx(hdc, 0, tabHeight-1, NULL); LineTo(hdc, width, tabHeight-1); SelectObject(hdc, old); if (activeTab >= 0 && activeTab < p->tabs.size() ) drawTab(hdc, p->xOffset, p->tabs[activeTab], true); RECT b={width-2*tabHeight, 0, width-tabHeight, tabHeight}; DrawFrameControl(hdc, &b, DFC_SCROLL, DFCS_SCROLLLEFT); b.left+=tabHeight; b.right+=tabHeight; DrawFrameControl(hdc, &b, DFC_SCROLL, DFCS_SCROLLRIGHT); EndPaint(hWnd, &ps); } break; case WM_KEYDOWN: smile_aktiv=40; if (wParam==VK_LEFT) PostMessage(hWnd, WM_COMMAND, TabsCtrl::PREVTAB, 0); if (wParam==VK_RIGHT) PostMessage(hWnd, WM_COMMAND, TabsCtrl::NEXTTAB, 0); break; case WM_LBUTTONDOWN: { smile_aktiv=40; int mouseX=GET_X_LPARAM(lParam); int mouseY=GET_Y_LPARAM(lParam); int width=p->clientRect.right; if (mouseY >= tabHeight) break; if (mouseX > width - tabHeight) { p->activeTab++; if (p->activeTab == p->tabs.size()) p->activeTab--; } else if (mouseX > width - 2*tabHeight) { if (p->activeTab != 0) p->activeTab--; } else for (unsigned int i=0; i < p->tabs.size(); i++) { TabInfoRef tab=p->tabs[i]; int tabX=p->xOffset+tab->tabXPos; if (mouseX < tabX) continue; if (mouseX > tabX+tab->tabWidth ) continue; p->activeTab=i; break; } InvalidateRect(p->getHWnd(), NULL, true); p->showActiveTab(); SHRGINFO shrg; shrg.cbSize = sizeof(shrg); shrg.hwndClient = hWnd; shrg.ptDown.x = LOWORD(lParam); shrg.ptDown.y = HIWORD(lParam); shrg.dwFlags = SHRG_RETURNCMD /*| SHRG_NOANIMATION*/; if (SHRecognizeGesture(&shrg) == GN_CONTEXTMENU) { p->processPopupMenu(false, LOWORD(lParam), HIWORD(lParam) ); } break; } case WM_COMMAND: { int cmd=LOWORD(wParam); if (cmd==TabsCtrl::CLOSETAB) { //close current tab int nextTab=p->activeTab; int delTab=nextTab; p->activeTab++; if (p->activeTab>=(int)p->tabs.size()) { nextTab--; p->activeTab=nextTab; } p->showActiveTab(); //hide before delete p->tabs.erase(p->tabs.begin()+delTab); p->activeTab=nextTab; p->tabDoLayout(); p->showActiveTab(); InvalidateRect(p->getHWnd(), NULL, true); } if (cmd==TabsCtrl::PREVTAB) { //go to prev tab // SetScrollInfo(p->tabScrollHWnd,SB_LEFT,0,0); if (p->activeTab > 0) { p->activeTab--; p->showActiveTab(); //hide before change p->tabDoLayout(); p->showActiveTab(); InvalidateRect(p->getHWnd(), NULL, true); } } if (cmd==TabsCtrl::NEXTTAB) { //go to next tab // SetScrollInfo(p->tabScrollHWnd,SB_RIGHT,0,0); if ((p->activeTab+1) < (int)p->tabs.size()) { p->activeTab++; p->showActiveTab(); //hide before change p->tabDoLayout(); p->showActiveTab(); InvalidateRect(p->getHWnd(), NULL, true); } } if (cmd==IDS_WINDOWS) { RECT rt; HWND parent=GetParent(p->getHWnd()); GetWindowRect(parent, &rt); RECT rb; SendMessage(g_hWndMenuBar, TB_GETRECT, IDS_WINDOWS, (LPARAM)&rb); p->processPopupMenu(true, rb.left, rt.bottom); } return 0; } case WM_MEASUREITEM: { LPMEASUREITEMSTRUCT mi=(LPMEASUREITEMSTRUCT)lParam; ODR * odr=(ODR *)(mi->itemData); mi->itemHeight=odr->getHeight(); mi->itemWidth=odr->getWidth(); return true; } case WM_DRAWITEM: { LPDRAWITEMSTRUCT di=(LPDRAWITEMSTRUCT) lParam; HBRUSH bgnd=CreateSolidBrush(GetBkColor(di->hDC)); FillRect(di->hDC, &(di->rcItem), bgnd); DeleteObject(bgnd); ODR * odr=(ODR *)(di->itemData); odr->draw(di->hDC, di->rcItem,0); return TRUE; } case WM_SIZE: { int height=GET_Y_LPARAM(lParam); int width=GET_X_LPARAM(lParam); SetRect(&(p->clientRect), 0, 0, width, height); p->updateChildsLayout(); break; } /*case WM_CTLCOLORSTATIC: case WM_CTLCOLORLISTBOX: case WM_CTLCOLOREDIT: { //HGDIOBJ brush= GetStockObject(GRAY_BRUSH); //HGDIOBJ pen= GetStockObject(WHITE_PEN); SetBkColor(hdc, 0x808080); SetTextColor(hdc, 0xffffff); //SelectObject((HDC)wParam, brush); //SelectObject((HDC)wParam, pen); return (BOOL) GetStockObject(GRAY_BRUSH); break; }*/ case WM_DESTROY: //TODO: Destroy all child data associated eith this window return 0; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }