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".
|