1

Тема: WinApi

Маю курсову повязану з WinApi функціями. Маю невиличкі проблеми і так. В мене у вікні програми є дві кнопки  hide close. Для них створений верхній вигляд в bmp форматі. Для розміщення їх на кнопки застосовую наступний код

 HBITMAP hBmp1=(HBITMAP)LoadImage(hInst,"close",IMAGE_BITMAP,0,0,0);
 HBITMAP hBmp2=(HBITMAP)LoadImage(hInst,"hide",IMAGE_BITMAP,0,0,0);


То сами роблю з іконкою

 hIco=LoadIcon(hInst,"icon");

Але нічого не змінюється кнопки чисті, іконка відсутння. Знаю що є такі файои ресурсів (*.rc), де необхідно додати відповідні зображення, як це зробити...я в тому новачок....допоможіть...

Твори в Україні...

2

Re: WinApi

Помилки ніякої не видає..

Твори в Україні...

3

Re: WinApi

GetLastError() пробували викликати?

4

Re: WinApi

Залийте сюди проект (гадаю, ви у VS робите).

I belong to the Dead Generation.

5

Re: WinApi

Bartash написав:

Залийте сюди проект (гадаю, ви у VS робите).

Так у VS//цю проблему вирішено

 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);
Твори в Україні...

6

Re: WinApi

Чи можети ви дати пояснення таким рядкам

 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;     
Твори в Україні...

7 Востаннє редагувалося Chemist-i (16.06.2013 00:20:47)

Re: WinApi

LeoDevel написав:

Чи можети ви дати пояснення таким рядкам

 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;     

Мабуть іконка з трея видаляється

TrayMessage(hwnd,NIM_DELETE,0,hIco,szText); // NIM_DELETE видалити іконку
ShowWindow(hwnd,SW_HIDE);// сховати вікно при натисканні на іконку
x

8

Re: WinApi

Тут, залежно від меншого слова wParam, вікно або згортається у трей, або закривається взагалі:

MSDN написав:

PostQuitMessage function

Indicates to the system that a thread has made a request to terminate (quit). It is typically used in response to a WM_DESTROY message.

I belong to the Dead Generation.

9

Re: WinApi

Chemist-i написав:
LeoDevel написав:

Чи можети ви дати пояснення таким рядкам

 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;     

Мабуть іконка з трея видаляється

TrayMessage(hwnd,NIM_DELETE,0,hIco,szText); // NIM_DELETE видалити іконку
ShowWindow(hwnd,SW_HIDE);// сховати вікно при натисканні на іконку

Я не розумію чому

LOWORD(wparam)==30000

та

LOWORD(wparam)==20000

Чому 20000 30000 ??

Твори в Україні...

10

Re: WinApi

Вочевидь, певні константи вінапішні. Мілкософти любили таке робити: всякі там дефайни, тіподефи, етц..

I belong to the Dead Generation.

11

Re: WinApi

Взагальному програма в мене працює все готово.це програма, яка має можливість зчитувати (захвачувати) колір певного об’єкту,тобто всього що розміщено на моніторі. З деяким кодом алгоритму мені допоміг викладач. Не можу зрозуміти саму суть яким чином в програмі зчитується колір. Догадуюся що це задопомогою повідомлень WM_TIMER

 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;

Якщо можна поясніть...
Це цілий алгоритм....

#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; 
 }
Твори в Україні...

12

Re: WinApi

clRGB=GetPixel(ScrDC,CurPos.x,CurPos.y);

Просто і банально..

I belong to the Dead Generation.

13 Востаннє редагувалося -=ЮрА=- (30.06.2013 21:18:36)

Re: WinApi

LeoDevel, ось тримай http://rghost.ru/47126442 (MFC VS 6.0 проект)
Коду дуже небагато

BOOL CLeoDevelDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);            // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon
    
    // Мій код
    HINSTANCE hInst = GetModuleHandle(NULL);
    HBITMAP hBmp1=(HBITMAP)LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));
    HBITMAP hBmp2=(HBITMAP)LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP2));
    m_ok.SetBitmap(hBmp1);
    m_cancel.SetBitmap(hBmp2);
        //кінець
    return TRUE;  // return TRUE  unless you set the focus to a control
}
Post's attachments

Безымянный.JPG 6.88 kb, 103 downloads since 2013-06-30