Finch
							
								Спокойный 
								Администратор
								
								 
								  Offline
								Пол:   
								
								Пролетал мимо
								
								
								
								
								
							  
						 | 
						
							
								  | 
								
									
									 « Ответ #10 : 12-01-2005 19:52 »   | 
								
								 | 
							  
							 
							race1, в создании компоненты в чистом API нет ничего сложного. Просто там нужно учитывать некоторые приколы, которые маскируются всеми надстройками. На каком уровне твои знания WinAPI? Выкладываю Код компоненты кнопка. Она конечно недоработана (В свое время я ее делал для узкой задачи) Button.h,//--------------------------------------------------------------------------- #ifndef button_H #define button_H
  const char FAR *szButtonName = "C_Button"; const UINT WM_SETACTION = WM_USER+2;
 
  typedef struct _ButtonStr {    HBRUSH   brBkGnd;    COLORREF RGBBkGnd;    bool     Drug;    bool     Down;    bool     Cup;    int      Action;    } ButtonStr;
  ButtonStr *Button_GetData(const HWND hwnd); ButtonStr *Button_NewData(const HWND hwnd);
  bool Button_Register(HINSTANCE); LRESULT CALLBACK Button_WndProc(HWND, UINT, WPARAM, LPARAM);
  bool Button_onCreate(HWND hWin, CREATESTRUCT FAR* lpCreateStruct); void Button_onPaint(HWND); void Button_OnDestroy(HWND hwnd); void Button_OnMouseMove(HWND hwnd, int x, int y, UINT keyFlags); void Button_OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags); void Button_OnLButtonUp(HWND hwnd, int x, int y, UINT keyFlags); bool Button_OnEraseBkgnd(HWND hwnd, HDC hdc); void Button_Paint(HWND,HDC); //--------------------------------------------------------------------------- #endif
   Button.cpp,//--------------------------------------------------------------------------- #include <windows.h> #include <windowsx.h>
  #include "button.h" #include "Basic.cpp"
  LRESULT CALLBACK Button_WndProc(HWND hWindow, UINT Message,                          WPARAM wParam, LPARAM lParam) {   ButtonStr *bst=Button_GetData(hWindow);    switch (Message)       {        HANDLE_MSG(hWindow, WM_DESTROY,     Button_OnDestroy);        HANDLE_MSG(hWindow, WM_CREATE,      Button_onCreate);        HANDLE_MSG(hWindow, WM_PAINT,       Button_onPaint);        HANDLE_MSG(hWindow, WM_MOUSEMOVE,   Button_OnMouseMove);        HANDLE_MSG(hWindow, WM_LBUTTONDOWN, Button_OnLButtonDown);        HANDLE_MSG(hWindow, WM_LBUTTONUP,   Button_OnLButtonUp);        HANDLE_MSG(hWindow, WM_ERASEBKGND,  Button_OnEraseBkgnd);         case WM_SETACTION :           bst->Action=wParam;           break;        default:           return DefWindowProc(hWindow, Message, wParam, lParam);       } } bool Button_Register(HINSTANCE hInst) {    WNDCLASS wc;
     wc.style         = CS_HREDRAW | CS_VREDRAW;    wc.lpfnWndProc   = (WNDPROC) Button_WndProc;    wc.cbClsExtra    = 0;    wc.cbWndExtra    = sizeof(ButtonStr);    wc.hInstance     = hInst;    wc.hIcon         = 0;    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);    wc.hbrBackground = (HBRUSH) GetStockObject(GRAY_BRUSH);    wc.lpszMenuName  = NULL;    wc.lpszClassName = szButtonName;
     return (RegisterClass(&wc) !=0);
  } void Button_OnMouseMove(HWND hwnd, int x, int y, UINT keyFlags) {  ButtonStr *bst=Button_GetData(hwnd);  POINT pt;  pt.x=x;  pt.y=y;  RECT r ;  SetRectEmpty(&r);  GetClientRect(hwnd, &r);  bst->Drug=PtInRect(&r,pt);  if (bst->Drug | bst->Down)     {      if (!bst->Cup)         {          SetCapture(hwnd);          HDC dc=GetDC(hwnd);          Button_OnEraseBkgnd(hwnd, dc);          Button_Paint(hwnd,dc);          ReleaseDC(hwnd,dc);          bst->Cup=true;         }     }  else     {      if (bst->Cup)         {          ReleaseCapture();          HDC dc=GetDC(hwnd);          Button_OnEraseBkgnd(hwnd, dc);          Button_Paint(hwnd,dc);          ReleaseDC(hwnd,dc);          bst->Cup=false;         }     }  }
  void Button_OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags) {  ButtonStr *bst=Button_GetData(hwnd);  bst->Down=true;  HDC dc=GetDC(hwnd);  Button_OnEraseBkgnd(hwnd, dc);  Button_Paint(hwnd,dc);  ReleaseDC(hwnd,dc); }
  void Button_OnLButtonUp(HWND hwnd, int x, int y, UINT keyFlags) {  ButtonStr *bst=Button_GetData(hwnd);  bst->Down=false;  HDC dc=GetDC(hwnd);  Button_OnEraseBkgnd(hwnd, dc);  Button_Paint(hwnd,dc);  ReleaseDC(hwnd,dc);  if (bst->Drug)     {     if (bst->Action !=0)        {          ReleaseCapture();          bst->Drug=false;          bst->Cup=false;          HDC dc=GetDC(hwnd);          Button_OnEraseBkgnd(hwnd, dc);          Button_Paint(hwnd,dc);          ReleaseDC(hwnd,dc);
 
         PostMessage((HWND) GetWindowLong(hwnd,GWL_HWNDPARENT),WM_COMMAND,bst->Action, (LONG) hwnd);        }     } }
  void Button_OnDestroy(HWND hwnd) { ButtonStr *Temp = (ButtonStr *) SetWindowLong(hwnd, GWL_USERDATA, 0); if (Temp->brBkGnd != NULL) DeleteObject(Temp->brBkGnd); if (Temp !=0) delete Temp; }
  bool Button_onCreate(HWND hwnd, CREATESTRUCT FAR* lpCreateStruct) { ButtonStr *bst=Button_NewData(hwnd); if (bst==0) return false; bst->RGBBkGnd=RGB(127,127,127); bst->brBkGnd=CreateSolidBrush(bst->RGBBkGnd); bst->Drug=false; bst->Down=false; bst->Action=0; return true; }
  void Button_onPaint(HWND hwnd) {    PAINTSTRUCT PaintStruct;
     HDC dc = BeginPaint(hwnd,&PaintStruct);    Button_Paint(hwnd,dc);    EndPaint(hwnd, &PaintStruct); }
  bool Button_OnEraseBkgnd(HWND hwnd, HDC hdc) {    RECT r;    SetRectEmpty(&r);    ButtonStr *bst=Button_GetData(hwnd);
     GetClientRect(hwnd, &r);    FillRect(hdc,&r,bst->brBkGnd);    return true; }
  ButtonStr *Button_GetData(const HWND hwnd) { return (ButtonStr *) GetWindowLong(hwnd,GWL_USERDATA); }
  ButtonStr *Button_NewData(const HWND hwnd) { ButtonStr *Bst = new ButtonStr; ButtonStr *Temp = (ButtonStr *) SetWindowLong(hwnd, GWL_USERDATA, (LONG) Bst); if (Temp !=0) delete Temp; return Bst; } void Button_Paint(HWND hwnd,HDC dc) {    int Size=GetWindowTextLength(hwnd);    ButtonStr *bst=Button_GetData(hwnd);    Size++;    char *Text=new char[Size];    GetWindowText(hwnd,Text,Size);    Text[Size-1]=0;    RECT r;    SetRectEmpty(&r);    GetClientRect(hwnd, &r);    SetBkMode(dc,TRANSPARENT);    if (bst->Drug | bst->Down)       {       if (bst->Down)           Frame3D(dc, &r, RGB(76,76,76),RGB(255,255,255), 2);       else           Frame3D(dc, &r, RGB(255,255,255), RGB(76,76,76),2);       }
     SetTextColor(dc,RGB(0,0,0));    DrawText(dc,Text,Size-1, &r,  DT_VCENTER | DT_SINGLELINE);    r.left--;    r.top--;    r.right--;    r.bottom--;    SetTextColor(dc,RGB(255,255,255));    DrawText(dc,Text,Size-1, &r,  DT_VCENTER | DT_SINGLELINE);
 
     delete Text; } //---------------------------------------------------------------------------
  Перед тем как использовать эту компоненту надо зарегистрировать ее с помошью функции  Button_Register. Потом создаеш обычное окно с помошью функции CreateWindow. Где в параметре pClassName указываеш "C_Button".  
						 |