Взагальному програма в мене працює все готово.це програма, яка має можливість зчитувати (захвачувати) колір певного об’єкту,тобто всього що розміщено на моніторі. З деяким кодом алгоритму мені допоміг викладач. Не можу зрозуміти саму суть яким чином в програмі зчитується колір. Догадуюся що це задопомогою повідомлень WM_TIMER
Якщо можна поясніть...
Це цілий алгоритм....
#include <windows.h>
#define MYWM_NOTIFYICON (WM_USER + 1)
char szClName[] = "My_Class";
char szCodeEdit[]="Колір";
char szCodePaint[]="";
COLORREF clRGB;
int iTray=0;
HICON hIco;
LONG WINAPI WndProc(HWND, UINT, WPARAM,LPARAM);//продекларована функція
BOOL TrayMessage(HWND,DWORD,UINT,HICON,PSTR);
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nCmdShow)
{
HWND hwnd,hBtn1,hBtn2;
MSG msg;
HBITMAP hBmp1=(HBITMAP)LoadImage(hInst,"close.bmp",IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION | LR_LOADFROMFILE);
HBITMAP hBmp2=(HBITMAP)LoadImage(hInst,"hide.bmp",IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION | LR_LOADFROMFILE);
WNDCLASS w;
memset(&w, 0, sizeof(WNDCLASS));
w.style = CS_HREDRAW | CS_VREDRAW;
w.lpfnWndProc = WndProc;
w.hInstance = hInst;
w.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(255,255,200)); //колір робочої області
w.lpszClassName = szClName;
w.hIcon=hIco;
RegisterClass(&w);
hwnd = CreateWindowEx(WS_EX_TOPMOST | WS_EX_TOOLWINDOW,szClName, "HTML код коліру:",
WS_POPUP | WS_DLGFRAME,70, 60, 215, 100, NULL, NULL, hInst, NULL);
CreateWindowEx(WS_EX_CLIENTEDGE, "edit",szCodeEdit, WS_CHILD | WS_VISIBLE |
ES_LEFT,42, 2, 70, 20, hwnd, (HMENU)10000, hInst, NULL);
hBtn1=CreateWindow("button", "", WS_CHILD | WS_VISIBLE | BS_BITMAP,
195, 4, 14, 14, hwnd, (HMENU)20000, hInst, NULL);
hBtn2=CreateWindow("button", "", WS_CHILD | WS_VISIBLE | BS_BITMAP,
179, 4, 14, 14, hwnd, (HMENU)30000, hInst, NULL);
SendMessage(hBtn1, BM_SETIMAGE, IMAGE_BITMAP, LPARAM(hBmp1));
SendMessage(hBtn2, BM_SETIMAGE, IMAGE_BITMAP, LPARAM(hBmp2));
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
SetTimer(hwnd, 1, 100, NULL);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
HDC hdc,ScrDC;
PAINTSTRUCT ps;
char szHelp[]="ENTER - Копіювати в вікно";
RECT rctCodePaint,rctColor;
POINT CurPos;
HBRUSH hBrsh;
char R[33],G[33],B[33],RGB[33],BUF[33];
BYTE bR,bG,bB;
SetRect(&rctCodePaint,115,0,175,20);
SetRect(&rctColor,6,3,35,20);
char szText[255];
if(Message == MYWM_NOTIFYICON && lparam == WM_LBUTTONDOWN)
{
if (iTray==0)
{
ShowWindow(hwnd,SW_HIDE);
iTray=1;
}else
{
ShowWindow(hwnd,SW_SHOW);
iTray=0;
}
}
switch (Message)
{
case WM_CREATE:
lstrcpy(szText,"показати/скрити"); // підсказка
TrayMessage(hwnd,NIM_ADD,0,hIco,szText); // NIM_ADD добавити ico в трей
break;
case WM_KEYDOWN:
{
if(LOWORD(wparam)==VK_RETURN)
{
HWND hwndEdit = GetDlgItem(hwnd, 10000);
SetWindowText(hwndEdit,szCodePaint);
}
}
break;
case WM_TIMER:
ScrDC=GetDC(NULL);
GetCursorPos(&CurPos);
clRGB=GetPixel(ScrDC,CurPos.x,CurPos.y);
bR=GetRValue(clRGB);bG=GetGValue(clRGB);bB=GetBValue(clRGB);
wsprintf(R,"%x",bR);
wsprintf(G,"%x",bG);
wsprintf(B,"%x",bB);
if (GetRValue(clRGB)<16) {lstrcpy(BUF,"0");lstrcat(BUF,R);lstrcpy(R,BUF);}
if (GetGValue(clRGB)<16) {lstrcpy(BUF,"0");lstrcat(BUF,G);lstrcpy(G,BUF);}
if (GetBValue(clRGB)<16) {lstrcpy(BUF,"0");lstrcat(BUF,B);lstrcpy(B,BUF);}
lstrcpy(RGB,"#");
lstrcat(RGB,R);
lstrcat(RGB,G);
lstrcat(RGB,B);
lstrcpy(szCodePaint,RGB);
InvalidateRect(hwnd,&rctCodePaint, TRUE);
InvalidateRect(hwnd,&rctColor, TRUE);
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
SetBkMode (hdc,TRANSPARENT);
SetTextColor(hdc,RGB(128,100,0));
TextOut( hdc, 115, 4,szCodePaint, lstrlen(szCodePaint));
SetTextColor(hdc,RGB(50,100,0));
TextOut( hdc, 10, 50,szHelp, lstrlen(szHelp));
hBrsh=CreateSolidBrush(clRGB);
FillRect(hdc,&rctColor,hBrsh);
DeleteObject(hBrsh);
EndPaint(hwnd, &ps);
break;
case WM_LBUTTONDOWN: //переміщення
SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION,0);
break;
case WM_COMMAND:
if(LOWORD(wparam)==20000)
{
TrayMessage(hwnd,NIM_DELETE,0,hIco,szText);
PostQuitMessage(0);
}
if(LOWORD(wparam)==30000)
{
ShowWindow(hwnd,SW_HIDE);
iTray=1;
}
break;
case WM_DESTROY:
TrayMessage(hwnd,NIM_DELETE,0,hIco,szText);
PostQuitMessage(0);
break;
default: return DefWindowProc(hwnd, Message, wparam, lparam);
}
return 0;
}
BOOL TrayMessage(HWND hwn,DWORD dwMsg,UINT uID,HICON hIcon,PSTR pszTip)
{
BOOL rezt;
NOTIFYICONDATA nid;
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hwn;
nid.uID = uID;
nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
nid.uCallbackMessage = MYWM_NOTIFYICON;// Повідомлення, які відправляться якщо
// курсор над іконкую або клік поньому
nid.hIcon = hIcon;
if (pszTip)
{
lstrcpyn(nid.szTip, pszTip, sizeof(nid.szTip));
}
else
{
nid.szTip[0] = '\0';
}
rezt = Shell_NotifyIcon(dwMsg, &nid);
return rezt;
}