Guest User

Untitled

a guest
Jan 28th, 2016
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <windows.h>
  2. #include <iostream>
  3. #include <conio.h>
  4. #include <cmath>
  5. #include <stdio.h>
  6. #include <string>
  7. #include <vector>
  8. using namespace std;
  9.  
  10. ///Klasa* = CreateVButton(&Klasa, DrawFunc, AddDrawFunc, "tekst", hFont, STYLE, x, y, width, height, id, hParent, (void*)anydata, hInstance);
  11.  
  12. #define CHECKBOX_ZDEFIONIOWANY 1
  13.  
  14. #define CHECKBOX_STAN_AKTYWNY             1
  15. #define CHECKBOX_STAN_AKTYWNYNAJECHANY    2
  16. #define CHECKBOX_STAN_WCISNIETY           3
  17. #define CHECKBOX_STAN_WCISNIETYNAJECHANY  4
  18. #define CHECKBOX_STAN_NIEAKTYWNY          5
  19.  
  20. #define CHECKBOX_STYL_Undefined           2
  21. #define CHECKBOX_STYL_Movable             4
  22. #define CHECKBOX_STYL_FastMovable         8
  23. #define CHECKBOX_STYL_SendMove            16
  24. #define CHECKBOX_STYL_SendBeforeMove      32
  25. #define CHECKBOX_STYL_StopXMove           64
  26. #define CHECKBOX_STYL_StopYMove           128
  27. #define CHECKBOX_STYL_IgnoreMoveRegion    256
  28. #define CHECKBOX_STYL_RegionCircle        512
  29. #define CHECKBOX_STYL_RegionTriangleLeft  1024
  30. #define CHECKBOX_STYL_RegionTriangleRight 2048
  31. #define CHECKBOX_STYL_RegionTriangleUp    4096
  32. #define CHECKBOX_STYL_RegionTriangleDown  8192
  33. #define CHECKBOX_STYL_AddIcon             16384
  34. #define CHECKBOX_STYL_SendCapture         32768
  35.  
  36. #define CHECKBOX_BEFOREMOVE           2
  37. #define CHECKBOX_MOVE                 4
  38. #define CHECKBOX_DBCLICK              8
  39. #define CHECKBOX_CLICK                16
  40. #define CHECKBOX_OUTOFREGION          32
  41. #define CHECKBOX_CAPTURE              64
  42. #define CHECKBOX_NOCAPTURE            128
  43. #define CHECKBOX_ADDDRAW              256
  44. #define CHECKBOX_DROPFILE             512
  45.  
  46. #ifndef KURSORX
  47.  #define KURSORX                     2
  48. #endif // KURSORX
  49. #ifndef KURSORY
  50.  #define KURSORY                     4
  51. #endif // KURSORY
  52.  
  53. #ifndef TEXTATT_AKTYWNY
  54.  #define TEXTATT_AKTYWNY             2
  55. #endif // TEXTATT_AKTYWNY
  56. #ifndef TEXTATT_AKTYWNYNAJECHANY
  57.  #define TEXTATT_AKTYWNYNAJECHANY    4
  58. #endif // TEXTATT_AKTYWNYNAJECHANY
  59. #ifndef TEXTATT_WCISNIETY
  60.  #define TEXTATT_WCISNIETY           8
  61. #endif // TEXTATT_WCISNIETY
  62. #ifndef TEXTATT_WCISNIETYNAJECHANY
  63.  #define TEXTATT_WCISNIETYNAJECHANY  16
  64. #endif // TEXTATT_WCISNIETYNAJECHANY
  65. #ifndef TEXTATT_NIEAKTYWNY
  66.  #define TEXTATT_NIEAKTYWNY          32
  67. #endif // TEXTATT_NIEAKTYWNY
  68.  
  69. typedef void( * CHECKBOXDRAW )( HWND hwnd, HDC *hDC , int width, int height);
  70. typedef void( * CHECKBOXADDDRAW )( HWND hwnd, HDC *hDC , int width, int height, void *wsk);
  71.  
  72. BOOL RejestrujCheckBox( HINSTANCE hInst );
  73. LRESULT CALLBACK CheckBoxProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
  74. class CreateVCheckBox{
  75.     public:
  76.         CreateVCheckBox(class CreateVCheckBox **wsk, CHECKBOXDRAW DrawFunc, CHECKBOXADDDRAW AddDrawFunc, char *tekst, HFONT myFont, DWORD myStyle, int x, int y, int Width, int Height, int ID, HWND hParent, void *myDane, HINSTANCE hInstance);
  77.         ~CreateVCheckBox();
  78.  
  79.         void Destroy();
  80.         HWND hWindow();
  81.         void ActualizeWindowInfo(WINDOWINFO *wsk);
  82.         int GetX();
  83.         int GetY();
  84.         void InfoSetX(int nowa);
  85.         void InfoSetY(int nowa);
  86.         void InfoSetWidth(int nowa);
  87.         void InfoSetHeight(int nowa);
  88.         int GetWindowWidth();
  89.         int GetWindowHeight();
  90.         void SetPos(POINT newPos);
  91.         void SetSize(POINT newSize);
  92.         int GetID();
  93.  
  94.         HDC GetHDC();
  95.         void OdswiezCheckBox();
  96.  
  97.         DWORD GetStyle();
  98.         void SetStyle(DWORD newStyle);
  99.         int GetStan();
  100.         void SetStan(int newStan);
  101.         bool GetCapture();
  102.         void SetCapture(bool newCapture);
  103.         bool GetMove();
  104.         void SetMove(bool newMove);
  105.         bool GetDbClick();
  106.         void SetDbClick(bool newValue);
  107.         bool KursorWewnatrz();
  108.         bool KursorWewnatrz(HRGN region, int x, int y, DWORD flags);
  109.         void SetMoveRegion(int x, int y, int width, int height, DWORD flags);
  110.         HRGN GetMoveRegion();
  111.  
  112.         void *GetDane();
  113.         void SetDane(void *newDane);
  114.  
  115.         void SetTekst(char *newNapis);
  116.         char *GetTekst();
  117.         void SetFont(HFONT newFont);
  118.         HFONT GetFont();
  119.         void WyswietlTekst(HDC hDC);
  120.         void ActualizeTextAttribute(POINT newTextPos, DWORD style, COLORREF newBackround, COLORREF newColour, int newAlign);
  121.         POINT *GetTextPos();
  122.         void SetTextPos(POINT newTextPos);
  123.  
  124.         void GetStartWindowSize(POINT *Point);
  125.         void SetStartWindowSize(POINT Point);
  126.  
  127.         void Resetuj();
  128.         void StopCurrentAction();
  129.         bool GetStopAction();
  130.         void SetStopAction(bool newAction);
  131.  
  132.         void GetIconPos(RECT *p); /// zrobic
  133.         void SetIconPos(RECT *p); /// zrobic
  134.         HDC GetIconDC(); /// zrobic
  135.         void SetIconDC(HBITMAP hBitmap); /// zrobic
  136.         CHECKBOXADDDRAW GetAddDrawFunc();
  137.  
  138.         POINT HelpVeriable;
  139.     private:
  140.         HWND hwnd_button;
  141.         WINDOWINFO WindowInfo;
  142.  
  143.         HRGN hRegion;
  144.         HRGN hMoveRegion;
  145.         HRGN CreateRegion(int width, int height, DWORD flags);
  146.  
  147.         HBITMAP hBmp;
  148.         HDC hDC;
  149.         CHECKBOXDRAW hDrawFunc;
  150.         CHECKBOXADDDRAW hAddDrawFunc;
  151.         void ClearBitmap();
  152.         void ClearDC();
  153.         void NarysujCheckBox(int width, int height, DWORD flags);
  154.  
  155.         DWORD Style;
  156.         int Stan;
  157.         bool Capture;
  158.         bool Move;
  159.         bool dbclick;
  160.         bool StopAction;
  161.  
  162.         void *Dane;
  163.  
  164.         char *Tekst;
  165.         HFONT hFont;
  166.         COLORREF Tlo[5];
  167.         COLORREF Colour[5];
  168.         int Align[5];
  169.         POINT TextPos;
  170.  
  171.         HDC hDC_Icon;
  172.         RECT IconPos;
  173.  
  174.         POINT StartWindowSize;
  175. };
  176.  
  177. CreateVCheckBox::CreateVCheckBox(class CreateVCheckBox **wsk, CHECKBOXDRAW DrawFunc, CHECKBOXADDDRAW AddDrawFunc, char *tekst, HFONT myFont, DWORD myStyle, int x, int y, int Width, int Height, int ID, HWND hParent, void *myDane, HINSTANCE hInstance){
  178.     if(!wsk)
  179.      return;
  180.  
  181.     Style = myStyle;
  182.     StartWindowSize.x = Width;
  183.     StartWindowSize.y = Height;
  184.     Dane = myDane;
  185.     hDrawFunc = DrawFunc;
  186.     hAddDrawFunc = AddDrawFunc;
  187.  
  188.     Stan = CHECKBOX_STAN_AKTYWNY;
  189.     Capture = false;
  190.     Move = false;
  191.     dbclick = false;
  192.     hRegion = 0;
  193.     hBmp = 0;
  194.     hDC = 0;
  195.     hDC_Icon = 0;
  196.  
  197.     HRGN region = CreateRegion(Width, Height, myStyle);
  198.     hRegion = CreateRegion(Width, Height, myStyle);
  199.  
  200.     hwnd_button = CreateWindowEx(WS_EX_COMPOSITED, "WH_VCHECKBOX", Tekst, WS_CHILD | WS_VISIBLE, x, y, Width, Height, hParent, (HMENU)ID, hInstance, (void*)wsk);
  201.  
  202.     WindowInfo.cbSize = sizeof(WINDOWINFO);
  203.     GetWindowInfo(hwnd_button, &WindowInfo);
  204.  
  205.     SetWindowLong(hwnd_button, 0, (LONG)wsk);
  206.     NarysujCheckBox(Width, Height, myStyle);
  207.     SetWindowRgn(hwnd_button, region, true);
  208.  
  209.     WINDOWINFO WndInfo;
  210.     WndInfo.cbSize = sizeof(WINDOWINFO);
  211.     GetWindowInfo(hParent, &WndInfo);
  212.     hMoveRegion = CreateRegion(WndInfo.rcClient.right - WndInfo.rcClient.left - Width, WndInfo.rcClient.bottom - WndInfo.rcClient.top - Height, Style);
  213.  
  214.     SetTekst(tekst);
  215.     if(!myFont)
  216.      SetFont(NULL);
  217.     else
  218.      hFont = myFont;
  219.  
  220.     POINT tekstpos;
  221.     tekstpos.x = Width/2;
  222.     tekstpos.y = 0;
  223.  
  224.     ActualizeTextAttribute(tekstpos, TEXTATT_AKTYWNY, TRANSPARENT, RGB(0, 0, 0), TA_CENTER);
  225.     ActualizeTextAttribute(tekstpos, TEXTATT_WCISNIETY, TRANSPARENT, RGB(0, 100, 0), TA_CENTER);
  226.     ActualizeTextAttribute(tekstpos, TEXTATT_AKTYWNYNAJECHANY, TRANSPARENT, RGB(200, 0, 200), TA_CENTER);
  227.     ActualizeTextAttribute(tekstpos, TEXTATT_WCISNIETYNAJECHANY, TRANSPARENT, RGB(255, 255, 255), TA_CENTER);
  228.     ActualizeTextAttribute(tekstpos, TEXTATT_NIEAKTYWNY, TRANSPARENT, RGB(100, 100, 100), TA_CENTER);
  229.  
  230.     SetIconPos(NULL);
  231. }
  232. CreateVCheckBox::~CreateVCheckBox(){
  233.     delete hFont;
  234.     ClearDC();
  235.     ClearBitmap();
  236.     delete Tekst;
  237.     DeleteObject(hRegion);
  238.     DeleteObject(hMoveRegion);
  239. }
  240. void CreateVCheckBox::Destroy(){
  241.     DestroyWindow(hwnd_button);
  242. }
  243. HWND CreateVCheckBox::hWindow(){
  244.     return hwnd_button;
  245. }
  246. void CreateVCheckBox::ActualizeWindowInfo(WINDOWINFO *wsk){
  247.     if(!wsk)
  248.      GetWindowInfo(hwnd_button, &WindowInfo);
  249.     else
  250.      GetWindowInfo(hwnd_button, wsk);
  251. }
  252. int CreateVCheckBox::GetX(){
  253.     WINDOWINFO Info;
  254.     GetWindowInfo(GetParent(hwnd_button), &Info);
  255.     GetWindowInfo(hwnd_button, &WindowInfo);
  256.     WindowInfo.rcClient.left = WindowInfo.rcClient.left - Info.rcClient.left;
  257.     WindowInfo.rcClient.right = WindowInfo.rcClient.right - Info.rcClient.right;
  258.     WindowInfo.rcClient.top = WindowInfo.rcClient.top - Info.rcClient.top;
  259.     WindowInfo.rcClient.bottom = WindowInfo.rcClient.bottom - Info.rcClient.bottom;
  260.  
  261.     return WindowInfo.rcClient.left;
  262. }
  263. int CreateVCheckBox::GetY(){
  264.     WINDOWINFO Info;
  265.     GetWindowInfo(GetParent(hwnd_button), &Info);
  266.     GetWindowInfo(hwnd_button, &WindowInfo);
  267.     WindowInfo.rcClient.left = WindowInfo.rcClient.left - Info.rcClient.left;
  268.     WindowInfo.rcClient.right = WindowInfo.rcClient.right - Info.rcClient.right;
  269.     WindowInfo.rcClient.top = WindowInfo.rcClient.top - Info.rcClient.top;
  270.     WindowInfo.rcClient.bottom = WindowInfo.rcClient.bottom - Info.rcClient.bottom;
  271.     return WindowInfo.rcClient.top;
  272. }
  273. int CreateVCheckBox::GetWindowWidth(){
  274.     GetWindowInfo(hwnd_button, &WindowInfo);
  275.     return WindowInfo.rcClient.right - WindowInfo.rcClient.left;
  276. }
  277. int CreateVCheckBox::GetWindowHeight(){
  278.     GetWindowInfo(hwnd_button, &WindowInfo);
  279.     return WindowInfo.rcClient.bottom - WindowInfo.rcClient.top;
  280. }
  281. void CreateVCheckBox::SetPos(POINT newPos){
  282.     SetWindowPos(hwnd_button, NULL, newPos.x, newPos.y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
  283.     InfoSetX(newPos.x);
  284.     InfoSetY(newPos.y);
  285.     OdswiezCheckBox();
  286. }
  287. void CreateVCheckBox::SetSize(POINT newSize){
  288.     InfoSetWidth(newSize.x);
  289.     InfoSetHeight(newSize.y);
  290.  
  291.     NarysujCheckBox(newSize.x, newSize.y, Style);
  292.     SetWindowPos(hwnd_button, NULL, 0, 0, newSize.x, newSize.y, SWP_NOMOVE | SWP_NOZORDER);
  293.  
  294.     HRGN region = CreateRegion(newSize.x, newSize.y, Style);
  295.     DeleteObject(hRegion);
  296.     hRegion = CreateRegion(newSize.x, newSize.y, Style);
  297.     SetWindowRgn(hwnd_button, region, TRUE);
  298.     OdswiezCheckBox();
  299. }
  300. void CreateVCheckBox::InfoSetX(int nowa){
  301.     WindowInfo.rcClient.left = nowa;
  302. }
  303. void CreateVCheckBox::InfoSetY(int nowa){
  304.     WindowInfo.rcClient.top = nowa;
  305. }
  306. void CreateVCheckBox::InfoSetWidth(int nowa){
  307.     WindowInfo.rcClient.right = WindowInfo.rcClient.left + nowa;
  308. }
  309. void CreateVCheckBox::InfoSetHeight(int nowa){
  310.     WindowInfo.rcClient.bottom = WindowInfo.rcClient.top + nowa;
  311. }
  312. void CreateVCheckBox::SetMoveRegion(int x, int y, int width, int height, DWORD flags){
  313.     DeleteObject(hMoveRegion);
  314.     if(flags & CHECKBOX_STYL_RegionCircle)
  315.      hMoveRegion = CreateEllipticRgn(x, y, width, height);
  316.     else
  317.      hMoveRegion = CreateRectRgn(x, y, width, height);
  318. }
  319. HRGN CreateVCheckBox::GetMoveRegion(){
  320.     return hMoveRegion;
  321. }
  322. int CreateVCheckBox::GetID(){
  323.     return GetWindowLong(hwnd_button, GWL_ID);
  324. }
  325.  
  326.  
  327. HDC CreateVCheckBox::GetHDC(){
  328.     return hDC;
  329. }
  330. void CreateVCheckBox::OdswiezCheckBox(){
  331.     InvalidateRect(hwnd_button, NULL, TRUE);
  332. }
  333.  
  334. DWORD CreateVCheckBox::GetStyle(){
  335.     return Style;
  336. }
  337. void CreateVCheckBox::SetStyle(DWORD newStyle){
  338.     Style = newStyle;
  339. }
  340. int CreateVCheckBox::GetStan(){
  341.     return Stan;
  342. }
  343. void CreateVCheckBox::SetStan(int newStan){
  344.     Stan = newStan;
  345.     if(Stan == CHECKBOX_STAN_NIEAKTYWNY)
  346.     {
  347.         SetCapture(false);
  348.         SetDbClick(false);
  349.         SetMove(false);
  350.         SetStopAction(true);
  351.         KillTimer(hwnd_button, 1);
  352.         KillTimer(hwnd_button, 2);
  353.         ReleaseCapture();
  354.     }
  355.     OdswiezCheckBox();
  356. }
  357. bool CreateVCheckBox::GetCapture(){
  358.     return Capture;
  359. }
  360. void CreateVCheckBox::SetCapture(bool newCapture){
  361.     if(Style & CHECKBOX_STYL_SendCapture)
  362.     {
  363.         if(newCapture)
  364.          SendMessage(GetParent(hwnd_button), WM_COMMAND,  MAKEWPARAM(GetWindowLong(hwnd_button, GWLP_ID), CHECKBOX_CAPTURE), 0);
  365.         else
  366.          SendMessage(GetParent(hwnd_button), WM_COMMAND,  MAKEWPARAM(GetWindowLong(hwnd_button, GWLP_ID), CHECKBOX_NOCAPTURE), 0);
  367.     }
  368.     Capture = newCapture;
  369. }
  370. bool CreateVCheckBox::KursorWewnatrz(){
  371.     POINT cur;
  372.     GetCursorPos( & cur );
  373.     ScreenToClient( hWindow(), & cur );
  374.     return PtInRegion(hRegion, cur.x, cur.y);
  375. }
  376. bool CreateVCheckBox::KursorWewnatrz(HRGN region, int x, int y, DWORD flags){
  377.     if((flags & KURSORX && flags & KURSORY) || flags == 0)
  378.      return PtInRegion(region, x, y);
  379.     return false;
  380. }
  381.  
  382. bool CreateVCheckBox::GetMove(){
  383.     return Move;
  384. }
  385. void CreateVCheckBox::SetMove(bool newMove){
  386.     Move = newMove;
  387. }
  388. bool CreateVCheckBox::GetDbClick(){
  389.     return dbclick;
  390. }
  391. void CreateVCheckBox::SetDbClick(bool newValue){
  392.     dbclick = newValue;
  393. }
  394.  
  395. void CreateVCheckBox::StopCurrentAction(){
  396.     StopAction = true;
  397. }
  398. bool CreateVCheckBox::GetStopAction(){
  399.     return StopAction;
  400. }
  401. void CreateVCheckBox::SetStopAction(bool newAction){
  402.     StopAction = newAction;
  403. }
  404.  
  405. void *CreateVCheckBox::GetDane(){
  406.     return Dane;
  407. }
  408. void CreateVCheckBox::SetDane(void *newDane){
  409.     Dane = newDane;
  410. }
  411.  
  412. void CreateVCheckBox::SetTekst(char *newNapis){
  413.     delete Tekst;
  414.     if(!newNapis){
  415.         Tekst = NULL;
  416.         return;
  417.     }
  418.  
  419.     Tekst = new char[strlen(newNapis)];
  420.     strcpy(Tekst, newNapis);
  421. }
  422. char *CreateVCheckBox::GetTekst(){
  423.     return Tekst;
  424. }
  425. void CreateVCheckBox::SetFont(HFONT newFont){
  426.     DeleteObject(hFont);
  427.     if(!newFont)
  428.      hFont = newFont;
  429.     else
  430.      hFont = CreateFont(72, 0, 0, 0, FW_NORMAL, 0, 0, 0, EASTEUROPE_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH| FF_DONTCARE, "Arial");
  431.     SelectObject(hDC, hFont);
  432. }
  433. HFONT CreateVCheckBox::GetFont(){
  434.     return hFont;
  435. }
  436. void CreateVCheckBox::WyswietlTekst(HDC hDC){
  437.     if(!Tekst)
  438.      return;
  439.     SetTextColor(hDC,Colour[Stan-1]);
  440.     if(Tlo[Stan-1] == TRANSPARENT)
  441.      SetBkMode(hDC,0);
  442.     else
  443.      SetBkColor(hDC, Tlo[Stan-1]);
  444.     SetTextAlign(hDC, Align[Stan-1]);
  445.  
  446.     TextOut(hDC, TextPos.x, TextPos.y, Tekst, strlen(Tekst));
  447. }
  448. void CreateVCheckBox::ActualizeTextAttribute( POINT newTextPos, DWORD style, COLORREF newBackround, COLORREF newColour, int newAlign){
  449.     TextPos.x = newTextPos.x;
  450.     TextPos.y = newTextPos.y;
  451.  
  452.     if(style & TEXTATT_AKTYWNY)
  453.     {
  454.         Colour[0] = newColour;
  455.         Tlo[0] = newBackround;
  456.         Align[0] = newAlign;
  457.     }
  458.     if(style & TEXTATT_AKTYWNYNAJECHANY)
  459.     {
  460.         Colour[1] = newColour;
  461.         Tlo[1] = newBackround;
  462.         Align[1] = newAlign;
  463.     }
  464.     if(style & TEXTATT_WCISNIETY)
  465.     {
  466.         Colour[2] = newColour;
  467.         Tlo[2] = newBackround;
  468.         Align[2] = newAlign;
  469.     }
  470.     if(style & TEXTATT_WCISNIETYNAJECHANY)
  471.     {
  472.         Colour[3] = newColour;
  473.         Tlo[3] = newBackround;
  474.         Align[3] = newAlign;
  475.     }
  476.     if(style & TEXTATT_NIEAKTYWNY)
  477.     {
  478.         Colour[4] = newColour;
  479.         Tlo[4] = newBackround;
  480.         Align[4] = newAlign;
  481.     }
  482.     OdswiezCheckBox();
  483. }
  484. POINT *CreateVCheckBox::GetTextPos(){
  485.     return &TextPos;
  486. }
  487. void CreateVCheckBox::SetTextPos(POINT newTextPos){
  488.     TextPos.x = newTextPos.x;
  489.     TextPos.y = newTextPos.y;
  490. }
  491.  
  492. void CreateVCheckBox::GetStartWindowSize(POINT *Point){
  493.     if(!Point)
  494.      return;
  495.     Point->x = StartWindowSize.x;
  496.     Point->y = StartWindowSize.y;
  497. }
  498. void CreateVCheckBox::SetStartWindowSize(POINT Point){
  499.     StartWindowSize.x = Point.x;
  500.     StartWindowSize.y = Point.y;
  501. }
  502. HRGN CreateVCheckBox::CreateRegion(int width, int height, DWORD flags){
  503.     HRGN hrgn = 0;
  504.     if(flags & CHECKBOX_STYL_RegionCircle)
  505.      hrgn = CreateEllipticRgn(0, 0, width, height);
  506.     else
  507.     if(flags & CHECKBOX_STYL_RegionTriangleDown)
  508.     {
  509.         POINT P[3];
  510.         P[0].x = width/2; P[0].y = height;
  511.         P[1].x = 0; P[1].y = 0;
  512.         P[2].x = width; P[2].y = 0;
  513.         hrgn = CreatePolygonRgn(P, 3, 1);
  514.     }
  515.     else
  516.     if(flags & CHECKBOX_STYL_RegionTriangleUp)
  517.     {
  518.         POINT P[3];
  519.         P[0].x = width/2; P[0].y = 0;
  520.         P[1].x = width; P[1].y = height;
  521.         P[2].x = 0; P[2].y = height;
  522.         hrgn = CreatePolygonRgn(P, 3, 1);
  523.     }
  524.     else
  525.     if(flags & CHECKBOX_STYL_RegionTriangleLeft)
  526.     {
  527.         POINT P[3];
  528.         P[0].x = 0; P[0].y = height/2;
  529.         P[1].x = width; P[1].y = 0;
  530.         P[2].x = width; P[2].y = height;
  531.         hrgn = CreatePolygonRgn(P, 3, 1);
  532.     }
  533.     else
  534.     if(flags & CHECKBOX_STYL_RegionTriangleRight)
  535.     {
  536.         POINT P[3];
  537.         P[0].x = width; P[0].y = height/2;
  538.         P[1].x = 0; P[1].y = height;
  539.         P[2].x = 0; P[2].y = 0;
  540.         hrgn = CreatePolygonRgn(P, 3, 1);
  541.     }
  542.     else
  543.      hrgn = CreateRectRgn(0, 0, width, height);
  544.     return hrgn;
  545. }
  546.  
  547. void CreateVCheckBox::ClearBitmap(){
  548.     DeleteObject(hBmp);
  549. }
  550. void CreateVCheckBox::ClearDC(){
  551.     ReleaseDC(hwnd_button, hDC);
  552. }
  553. void CreateVCheckBox::NarysujCheckBox(int width, int height, DWORD flags){
  554.     ClearDC();
  555.     ClearBitmap();
  556.  
  557.     hDC = GetDC(hwnd_button);
  558.     hBmp = CreateCompatibleBitmap(hDC, width*4, height);
  559.     hDC = CreateCompatibleDC(NULL);
  560.     SelectObject(hDC, hBmp);
  561.  
  562.     hDrawFunc(hwnd_button, &hDC, width, height);
  563. }
  564. void CreateVCheckBox::Resetuj(){
  565.     SetStan(CHECKBOX_STAN_AKTYWNY);
  566.     SetCapture(false);
  567.     SetDbClick(false);
  568.     SetMove(false);
  569.     SetStopAction(true);
  570.     KillTimer(hwnd_button, 1);
  571.     KillTimer(hwnd_button, 2);
  572.     ReleaseCapture();
  573.     OdswiezCheckBox();
  574. }
  575.  
  576. void CreateVCheckBox::GetIconPos(RECT *p){
  577.     if(!p)
  578.      return;
  579.     p->bottom = IconPos.bottom;
  580.     p->left = IconPos.left;
  581.     p->right = IconPos.right;
  582.     p->top = IconPos.top;
  583. }
  584. void CreateVCheckBox::SetIconPos(RECT *p){
  585.     if(p == NULL)
  586.     {
  587.         IconPos.bottom = 0;
  588.         IconPos.left = 0;
  589.         IconPos.right = 0;
  590.         IconPos.top = 0;
  591.         return;
  592.     }
  593.     IconPos.bottom = p->bottom;
  594.     IconPos.left = p->left;
  595.     IconPos.right = p->right;
  596.     IconPos.top = p->top;
  597. }
  598. HDC CreateVCheckBox::GetIconDC(){
  599.     return hDC_Icon;
  600. }
  601. void CreateVCheckBox::SetIconDC(HBITMAP hBitmap){
  602.     ReleaseDC(hWindow(), hDC_Icon);
  603.     if(!hBitmap)
  604.      return;
  605.     hDC_Icon = GetDC(hwnd_button);
  606.     hDC_Icon = CreateCompatibleDC(NULL);
  607.     SelectObject(hDC_Icon, hBitmap);
  608.  
  609.     OdswiezCheckBox();
  610. }
  611. CHECKBOXADDDRAW CreateVCheckBox::GetAddDrawFunc(){
  612.     return hAddDrawFunc;
  613. }
  614.  
  615. BOOL RejestrujCheckBox( HINSTANCE hInst ){
  616.     WNDCLASS wc;
  617.     wc.style = 0; // stylowy kibel? ;-)
  618.     wc.lpszMenuName = NULL;
  619.     wc.lpszClassName = "WH_VCHECKBOX";
  620.     wc.hInstance = hInst;
  621.     wc.lpfnWndProc = CheckBoxProc;
  622.     wc.cbWndExtra = 16;
  623.     wc.cbClsExtra = 16;
  624.     wc.hIcon = NULL;
  625.     wc.hCursor = LoadCursor (NULL, IDC_ARROW);
  626.     wc.hbrBackground =( HBRUSH ) GetStockObject( NULL_BRUSH );
  627.  
  628.     if( !RegisterClass( & wc ) ) return FALSE;
  629.  
  630.     return TRUE;
  631. }
  632. LRESULT CALLBACK CheckBoxProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
  633.     switch (message)                  /* handle the messages */
  634.     {
  635.         case WM_PAINT:{
  636.             CreateVCheckBox * wsk = *((CreateVCheckBox **) GetWindowLong(hwnd, 0));
  637.             if(!wsk)
  638.              break;
  639.             PAINTSTRUCT ps;
  640.             HDC hdc = BeginPaint(hwnd, &ps);
  641.  
  642.             BitBlt( hdc, 0, 0, wsk->GetWindowWidth(), wsk->GetWindowHeight(), wsk->GetHDC(), (wsk->GetStan()-1)*wsk->GetWindowWidth(), 0, SRCCOPY );
  643.             wsk->WyswietlTekst(hdc);
  644.  
  645.             if(wsk->GetAddDrawFunc())
  646.              wsk->GetAddDrawFunc()(NULL, &hdc, wsk->GetWindowWidth(), wsk->GetWindowHeight(), wsk->GetDane());
  647.             if(wsk->GetIconDC())
  648.             {
  649.                 RECT IconPos;
  650.                 wsk->GetIconPos(&IconPos);
  651.                 BitBlt( hdc, IconPos.left, IconPos.top, IconPos.right-IconPos.left, IconPos.bottom-IconPos.top, wsk->GetIconDC(), 0, 0, SRCCOPY );
  652.  
  653.             }
  654.  
  655.             EndPaint(hwnd, &ps);
  656.             break;
  657.         }
  658.         case WM_MOUSEMOVE:{
  659.             CreateVCheckBox * wsk = *((CreateVCheckBox **) GetWindowLong(hwnd, 0));
  660.             if(!wsk || wsk->GetStan() == CHECKBOX_STAN_NIEAKTYWNY)
  661.              break;
  662.             wsk->SetDbClick(false);
  663.             if(wsk->GetMove()){
  664.                 POINT cur;
  665.                 GetCursorPos( & cur );
  666.                 ScreenToClient( GetParent(hwnd), & cur );
  667.  
  668.                 ///Stop X/Y Move
  669.                 if(wsk->GetStyle() & CHECKBOX_STYL_StopXMove)
  670.                  cur.x = wsk->GetX();
  671.                 else
  672.                  cur.x = cur.x - wsk->HelpVeriable.x;
  673.                 if(wsk->GetStyle() & CHECKBOX_STYL_StopYMove)
  674.                  cur.y = wsk->GetY();
  675.                 else
  676.                  cur.y = cur.y - wsk->HelpVeriable.y;
  677.  
  678.                 ///SendCommand Before Move
  679.                 if(wsk->GetStyle() & CHECKBOX_STYL_SendBeforeMove)
  680.                  SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(GetWindowLong(hwnd, GWLP_ID), CHECKBOX_BEFOREMOVE), (LPARAM)&cur);
  681.                 if(wsk->GetStopAction()){
  682.                     wsk->SetStopAction(false);
  683.                     break;
  684.                 }
  685.  
  686.                 ///SetPos // sprawdzanie MoveRegion
  687.                 if(wsk->GetStyle() & CHECKBOX_STYL_IgnoreMoveRegion)
  688.                  wsk->SetPos(cur);
  689.                 else
  690.                  if(wsk->KursorWewnatrz(wsk->GetMoveRegion(), cur.x, cur.y, 0))
  691.                   wsk->SetPos(cur);
  692.  
  693.                 ///Send Command after Move
  694.                 if(wsk->GetStyle() & CHECKBOX_STYL_SendMove)
  695.                  SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(GetWindowLong(hwnd, GWLP_ID), CHECKBOX_MOVE), 0);
  696.  
  697.                 break;
  698.             }
  699.             if(!wsk->GetCapture()){
  700.                 if(wsk->GetStan() == CHECKBOX_STAN_AKTYWNY)
  701.                  wsk->SetStan(CHECKBOX_STAN_AKTYWNYNAJECHANY);
  702.                 else
  703.                 if(wsk->GetStan() == CHECKBOX_STAN_WCISNIETY)
  704.                  wsk->SetStan(CHECKBOX_STAN_WCISNIETYNAJECHANY);
  705.                 wsk->SetCapture(true);
  706.                 SetCapture(hwnd);
  707.  
  708.             }
  709.             if(!wsk->KursorWewnatrz()){
  710.                 switch(wsk->GetStan())
  711.                 {
  712.                     case CHECKBOX_STAN_AKTYWNYNAJECHANY:{
  713.                         wsk->SetStan(CHECKBOX_STAN_AKTYWNY);
  714.                         break;
  715.                     }
  716.                     case CHECKBOX_STAN_WCISNIETYNAJECHANY:{
  717.                         wsk->SetStan(CHECKBOX_STAN_WCISNIETY);
  718.                         break;
  719.                     }
  720.                 }
  721.                 wsk->SetCapture(false);
  722.                 wsk->SetDbClick(false);
  723.                 wsk->SetMove(false);
  724.                 wsk->SetStopAction(true);
  725.                 KillTimer(hwnd, 1);
  726.                 KillTimer(hwnd, 2);
  727.                 ReleaseCapture();
  728.             }
  729.             break;
  730.         }
  731.         case WM_LBUTTONDOWN:{
  732.             CreateVCheckBox * wsk = *((CreateVCheckBox **) GetWindowLong(hwnd, 0));
  733.             if(!wsk || wsk->GetStan() == CHECKBOX_STAN_NIEAKTYWNY)
  734.              break;
  735.  
  736.             if(wsk->GetStyle() & CHECKBOX_STYL_Movable)
  737.              SetTimer(hwnd, 1, 500, NULL);
  738.             if(wsk->GetStyle() & CHECKBOX_STYL_FastMovable)
  739.              SendMessage(hwnd, WM_TIMER, 1, 0);
  740.             if(!wsk->GetDbClick())
  741.             {
  742.                 SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(GetWindowLong(hwnd, GWLP_ID), CHECKBOX_CLICK), 0);
  743.                 wsk->SetDbClick(true);
  744.                 SetTimer(hwnd, 2, 400, NULL);
  745.             }
  746.             else
  747.             {
  748.                 SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(GetWindowLong(hwnd, GWLP_ID), CHECKBOX_CLICK | CHECKBOX_DBCLICK), 0);
  749.                 wsk->SetDbClick(false);
  750.                 KillTimer(hwnd, 2);
  751.             }
  752.             break;
  753.         }
  754.         case WM_LBUTTONUP:{
  755.             CreateVCheckBox * wsk = *((CreateVCheckBox **) GetWindowLong(hwnd, 0));
  756.             if(!wsk || wsk->GetStan() == CHECKBOX_STAN_NIEAKTYWNY)
  757.              break;
  758.             if(wsk->GetStyle() & CHECKBOX_STYL_Movable || wsk->GetStyle() & CHECKBOX_STYL_FastMovable){
  759.                 KillTimer(hwnd, 1);
  760.                 wsk->SetMove(false);
  761.             }
  762.             break;
  763.         }
  764.         case WM_DROPFILES:{
  765.             SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(GetWindowLong(hwnd, GWLP_ID), CHECKBOX_DROPFILE), (LPARAM)wParam);
  766.             break;
  767.         }
  768.         case WM_TIMER:{
  769.             CreateVCheckBox * wsk = *((CreateVCheckBox **) GetWindowLong(hwnd, 0));
  770.             if(!wsk || wsk->GetStan() == CHECKBOX_STAN_NIEAKTYWNY)
  771.              break;
  772.             switch(wParam){
  773.                 case 1:{ /// Timer do Move
  774.                     wsk->ActualizeWindowInfo(NULL);
  775.                     wsk->SetMove(true);
  776.  
  777.                     GetCursorPos( & wsk->HelpVeriable );
  778.                     ScreenToClient( GetParent(hwnd), & wsk->HelpVeriable );
  779.                     wsk->HelpVeriable.x = wsk->HelpVeriable.x - wsk->GetX();
  780.                     wsk->HelpVeriable.y = wsk->HelpVeriable.y - wsk->GetY();
  781.  
  782.                     KillTimer(hwnd, 1);
  783.                     break;
  784.                 }
  785.                 case 2:{ /// Timer do DbClick
  786.                     wsk->SetDbClick(false);
  787.                     KillTimer(hwnd, 2);
  788.                     break;
  789.                 }
  790.             }
  791.             break;
  792.         }
  793.         case WM_DESTROY:{
  794.             CreateVCheckBox * wsk = *((CreateVCheckBox **) GetWindowLong(hwnd, 0));
  795.             if(!wsk)
  796.              break;
  797.             if(GetCapture() == hwnd)
  798.              ReleaseCapture();
  799.             delete wsk;
  800.             break;
  801.         }
  802.         default:                      /* for messages that we don't deal with */
  803.             return DefWindowProc (hwnd, message, wParam, lParam);
  804.     }
  805.  
  806.     return 0;
  807. }
Add Comment
Please, Sign In to add comment