2013-04-08 2 views
1

Я использую API win32, и это мой код (у меня уже была небольшая помощь с этого сайта;)).Изменение цвета шрифта одним щелчком мыши

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, 
          WPARAM wParam, LPARAM lParam) 
    { 
    HDC hdc; 
    PAINTSTRUCT ps; 
    RECT  rect; 
    RECT  size; 
    int   width; 
    char *  widthHeight; 
    static char  Swidth[32]; 
    static char  Sheight[32]; 
    int   height; 
    char  sBottom[32]; 
    char  sTop[32]; 
    char  sLeft[32]; 
    char  sRight[32]; 
    char  SrightButtonClicked[32]; 
    static int rightButtonClicked = 0; 
    char  SleftButtonClicked[32]; 
    static int leftButtonClicked = 0; 
    static bool LeftButtonClicked = false; 
    static bool RightButtonClicked = false; 

    switch (message) 
     { 
      case WM_PAINT: 
       hdc = BeginPaint (hwnd, &ps); 

       if(LeftButtonClicked == true) 
       { 
        SetDCPenColor(hdc, RGB(0, 0, 255)); 
        LeftButtonClicked = false; 
       } 

       if(RightButtonClicked == true) 
       { 
        SetDCPenColor(hdc, RGB(255, 0, 0)); 
        RightButtonClicked = false; 
       } 

       GetClientRect (hwnd, &rect); 

       GetWindowRect(hwnd, &size); 

       //Variables used in outputting. 
       width = size.right - size.left; 
       itoa(width, Swidth, 10); 
       height = size.bottom - size.top; 
       itoa(height, Sheight, 10); 
       itoa(rect.bottom, sBottom, 10); 
       itoa(rect.top, sTop, 10); 
       itoa(rect.left, sLeft, 10); 
       itoa(rect.right, sRight, 10); 

       //Line 1, Width and height output 
       TextOut(hdc, 0, 0, "Here is my width: ", 18); 
       TextOut(hdc, 125, 0, Swidth, 5); 
       TextOut(hdc, 175, 0, "Here is my height: ", 18); 
       TextOut(hdc, 300, 0, Sheight, 4); 

       //Line 2, Output the bottom, right, left, and top of the window 
       TextOut(hdc, 0, 20, sBottom, strlen(sBottom)); 
       TextOut(hdc, 50, 20, sTop, strlen(sTop)); 
       TextOut(hdc, 100, 20, sRight, strlen(sRight)); 
       TextOut(hdc, 150, 20, sLeft, strlen(sLeft)); 

       //Outputs the number of times right click has been clicked 
       TextOut(hdc, 0, 40, "Right Button Clicked: ", 23); 
       itoa(rightButtonClicked, SrightButtonClicked, 10); 
       TextOut(hdc, 150, 40, SrightButtonClicked, strlen(SrightButtonClicked)); 

       //Output the number of times left click has been clicked 
       TextOut(hdc, 0, 60, "Left Button Clicked: ", 22); 
       itoa(leftButtonClicked, SleftButtonClicked, 10); 
       TextOut(hdc, 150, 60, SleftButtonClicked, strlen(SleftButtonClicked)); 
       EndPaint (hwnd, &ps); 
       return 0; 

      case WM_LBUTTONDOWN: 

       leftButtonClicked++; 
       LeftButtonClicked = true; 
       InvalidateRect(hwnd, 0, true); 
       return 0; 

      case WM_RBUTTONDOWN: 
       rightButtonClicked++; 
       RightButtonClicked = true; 

       //Uses char * widthHeight to concat all the resolution into one char to output in Messagebox 
       widthHeight = new char[strlen(Swidth) + strlen(Sheight) + 4]; 
       widthHeight = Swidth; 
       strcat(widthHeight, " x "); 
       strcat(widthHeight, Sheight); 

       //Has a message box pop up with resolution of window in Mouse Button OK format 
       MessageBox(NULL, widthHeight , "Right Mouse Button Pressed!", MB_OK); 
       InvalidateRect(hwnd, 0, true); 
       return 0; 

      case WM_DESTROY: 
       PostQuitMessage(0); 
       return 0; 

     } 

    return DefWindowProc (hwnd, message, wParam, lParam); 
    } 

Теперь я хочу, чтобы это делало что-то вроде изменения цвета текста, когда я оставил клик на цвет .. Скажем, красный? и когда я нажимаю правой кнопкой мыши, поймаем ли он синий цвет. Как бы я это сделал? Я много гугнул, и все кажется очень сложным.

+1

Пожалуйста, прочтите [статью MSDN] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd145133 (ст = vs.85) .aspx) для TextOut, он показывает вам, какие цвета он использует для визуализации текста. Ссылки на функции winapi, которые изменяют эти цвета, находятся в нижней части статьи. Программирование Windows Petzold также является отличным источником базовой информации, подобной этой. –

+0

Спасибо =). Это сработало. Я не понимал, что все так просто! –

ответ

0

Попробуйте это, прежде чем начать вывод (после того, как ваш звонок BeginPaint() будет работать):

// Set the Pen to Blue 
SetDCPenColor(hdc, RGB(0,0,255)); 

Для того, чтобы делать то, что вы хотели просто установить значение в вашей мыши вниз обработчика, который вы проверяете для вашей краски обработчик. Используйте черный, если он не установлен [RGB (0,0,0)], и если он установлен, используйте синий [RGB (0,0,255)].

РЕДАКТИРОВАТЬ: И НЕ используйте статический hdc. Все хотят сделать это, но это не сработает. HDC фактически поддерживается вне процесса ОС, поэтому C++ не сможет отслеживать его. В конечном итоге это гарантированный отказ. Всегда используйте новый hdc (или что-то вроде DC), прежде чем использовать его.

EDIT 2: Попробуйте вместо ...

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, 
         WPARAM wParam, LPARAM lParam) 
{ 
HDC hdc; 
PAINTSTRUCT ps; 
RECT  rect; 
RECT  size; 
int   width; 
char *  widthHeight; 
static char  Swidth[32]; 
static char  Sheight[32]; 
int   height; 
char  sBottom[32]; 
char  sTop[32]; 
char  sLeft[32]; 
char  sRight[32]; 
char  SrightButtonClicked[32]; 
static int rightButtonClicked = 0; 
char  SleftButtonClicked[32]; 
static int leftButtonClicked = 0; 
static bool LeftButtonClicked = false; 
static bool RightButtonClicked = false; 
static COLORREF pencolor = RGB(0,0,0); // Added by KRowe 

switch (message) 
    { 
     case WM_PAINT: 
      hdc = BeginPaint (hwnd, &ps); 

      SetDCPenColor(hdc, pencolor); // Added by KRowe 

      GetClientRect (hwnd, &rect); 
      GetWindowRect(hwnd, &size); 

      //Variables used in outputting. 
      width = size.right - size.left; 
      itoa(width, Swidth, 10); 
      height = size.bottom - size.top; 
      itoa(height, Sheight, 10); 
      itoa(rect.bottom, sBottom, 10); 
      itoa(rect.top, sTop, 10); 
      itoa(rect.left, sLeft, 10); 
      itoa(rect.right, sRight, 10); 

      //Line 1, Width and height output 
      TextOut(hdc, 0, 0, "Here is my width: ", 18); 
      TextOut(hdc, 125, 0, Swidth, 5); 
      TextOut(hdc, 175, 0, "Here is my height: ", 18); 
      TextOut(hdc, 300, 0, Sheight, 4); 

      //Line 2, Output the bottom, right, left, and top of the window 
      TextOut(hdc, 0, 20, sBottom, strlen(sBottom)); 
      TextOut(hdc, 50, 20, sTop, strlen(sTop)); 
      TextOut(hdc, 100, 20, sRight, strlen(sRight)); 
      TextOut(hdc, 150, 20, sLeft, strlen(sLeft)); 

      //Outputs the number of times right click has been clicked 
      TextOut(hdc, 0, 40, "Right Button Clicked: ", 23); 
      itoa(rightButtonClicked, SrightButtonClicked, 10); 
      TextOut(hdc, 150, 40, SrightButtonClicked, strlen(SrightButtonClicked)); 

      //Output the number of times left click has been clicked 
      TextOut(hdc, 0, 60, "Left Button Clicked: ", 22); 
      itoa(leftButtonClicked, SleftButtonClicked, 10); 
      TextOut(hdc, 150, 60, SleftButtonClicked, strlen(SleftButtonClicked)); 
      EndPaint (hwnd, &ps); 
      return 0; 

     case WM_LBUTTONDOWN: 

      leftButtonClicked++; 
      LeftButtonClicked = true; 
      pencolor = RGB(255,0,0); // Added by KRowe 
      InvalidateRect(hwnd, 0, true); 
      return 0; 

     case WM_RBUTTONDOWN: 
      rightButtonClicked++; 
      RightButtonClicked = true; 
      pencolor = RGB(0, 255,0); // Added by KRowe 
      widthHeight = new char[strlen(Swidth) + strlen(Sheight) + 4]; 
      widthHeight = Swidth; 
      strcat(widthHeight, " x "); 
      strcat(widthHeight, Sheight); 

      //Has a message box pop up with resolution of window in Mouse Button OK format 
      MessageBox(NULL, widthHeight , "Right Mouse Button Pressed!", MB_OK); 
      InvalidateRect(hwnd, 0, true); 
      return 0; 

     case WM_DESTROY: 
      PostQuitMessage(0); 
      return 0; 

    } 

return DefWindowProc (hwnd, message, wParam, lParam); 
} 
+0

Не повезло. Мне пришлось сделать статическую переменную hdc, чтобы она не сломалась, но она по-прежнему не превращает текст в синий. –

+0

Исправьте меня, если я ошибаюсь, но я думал, что hdc можно использовать, установив его равным BeginPaint, а начальная и конечная краска используются только в WM_PAINT .. Итак, как бы получить новый hdc в моем случае? Просто создайте BeginPaint и EndPaint? –

+0

Я отредактировал свое предыдущее сообщение, чтобы включить мой новый код, который не работает .. :( –

Смежные вопросы