鱼C论坛

 找回密码
 立即注册
查看: 1599|回复: 0

[技术交流] 对话框(非模式)调色板③

[复制链接]
发表于 2018-7-18 00:17:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 qq1242009750 于 2018-9-10 20:18 编辑

本贴来实现以下功能:
4.应为原色的范围是 0 - 255,所以滚动条的范围要和原色一致(0 - 255) 可以用SetScrollInfo函数来设置
5.滚动条背景可以显示当前原色的颜色,当原色色号为0时显示黑色,色号用全局变量保存
6.改变滚动条的背景颜色可以用WM_CTLCOLORSCROLLBAR消息来改变,此消息要返回一个画刷句柄,此句柄就是滚动条背景色的句柄
7.当滚动条被拖动或两边按键被点击时,要能正确相应消息,滚动条被拖动或两边按键会发送WM_VSCROLL下的SB_THUMTRACK(拖动)、SB_LINEUP、SB_LINEDOWN消息
8.滚动条滚动完毕后也要改变对应的色号,并在滚动条的下方显示出来


好我们来接着写:
         接下来我们主要的是对话框的操作,所以只要对对话框过程函数进行修改就好了.
         在这里做个ID号的说明:
                IDC_SCROLLBAR4    对应的是红色滚动条
                IDC_SCROLLBAR5    对应的是绿色滚动条
                IDC_SCROLLBAR6    对应的是蓝色滚动条
                IDC_STATIC1          对应的是红色色号
                IDC_STATIC2          对应的是绿色色号
                IDC_STATIC3          对应的是蓝色色号


下面给出代码,其实代码主要动的地方就无非是多了3个全局变量和修改了对话框处理过程
  1. #include <tchar.h>
  2. #include <windows.h>
  3. #include "resource.h"

  4. #define CLASSNAME TEXT("Name")

  5. void CfiWndClass(HINSTANCE hInstance);
  6. LRESULT _stdcall WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
  7. INT_PTR _stdcall DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);

  8. HWND DlghWnd;
  9. int R, G, B;        //全局色号

  10. void CfiWndClass(HINSTANCE hInstance)
  11. {
  12.         WNDCLASSEX wcx;
  13.         wcx.cbSize = sizeof(WNDCLASSEX);
  14.         wcx.cbClsExtra = 0;
  15.         wcx.cbWndExtra = 0;
  16.         wcx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  17.         wcx.hCursor = LoadCursor(hInstance, IDC_ARROW);
  18.         wcx.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
  19.         wcx.hIconSm = NULL;
  20.         wcx.hInstance = hInstance;
  21.         wcx.lpfnWndProc = WndProc;
  22.         wcx.lpszClassName = CLASSNAME;
  23.         wcx.lpszMenuName = NULL;
  24.         wcx.style = CS_VREDRAW | CS_HREDRAW;
  25.         RegisterClassEx(&wcx);
  26. }

  27. int _stdcall _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd)
  28. {
  29.         CfiWndClass(hInstance);
  30.         HWND hWnd = CreateWindow(CLASSNAME, TEXT("GsssD"), WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, NULL, hInstance, 0);

  31.         MSG msg;

  32.         while (GetMessage(&msg, nullptr, 0, 0))
  33.         {
  34.                 if (DlghWnd == 0 || !IsDialogMessage(DlghWnd, &msg))
  35.                 {
  36.                         TranslateMessage(&msg);
  37.                         DispatchMessage(&msg);
  38.                 }
  39.         }

  40.         return 0;
  41. }

  42. LRESULT _stdcall WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  43. {
  44.         switch (message)
  45.         {
  46.         case WM_CREATE:
  47.                 DlghWnd = CreateDialog((HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DlgProc);
  48.                 ShowWindow(DlghWnd, SW_SHOW);
  49.                 break;

  50.         case WM_CLOSE:
  51.                 DestroyWindow(hWnd);
  52.                 break;

  53.         case WM_DESTROY:
  54.                 PostQuitMessage(0);
  55.                 break;

  56.         default:
  57.                 return DefWindowProc(hWnd, message, wParam, lParam);
  58.         }

  59.         return 0;
  60. }

  61. INT_PTR _stdcall DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  62. {
  63.         BOOL Ret = FALSE;
  64.         int i = 0;
  65.         SCROLLINFO si;
  66.         si.cbSize = sizeof(SCROLLINFO);

  67.         switch (message)
  68.         {
  69.         case WM_INITDIALOG:
  70.                 si.fMask = SIF_POS | SIF_RANGE;                //设置标志位
  71.                 si.nMin = 0;
  72.                 si.nMax = 255;                //设置滚动条的范围 0 - 255
  73.                 si.nPos = 0;
  74.                 for (i = IDC_SCROLLBAR4; i <= IDC_SCROLLBAR6; ++i)
  75.                         SetScrollInfo(GetDlgItem(hDlg, i), SB_CTL, &si, FALSE);
  76.                 Ret = TRUE;
  77.                 break;

  78.         case WM_VSCROLL:
  79.                 si.fMask = SIF_POS;
  80.                 GetScrollInfo((HWND)lParam, SB_CTL, &si);
  81.                 switch (LOWORD(wParam))
  82.                 {
  83.                 case SB_LINEUP:                                //上箭头
  84.                         if (si.nPos > 0)
  85.                                 --si.nPos;
  86.                         break;

  87.                 case SB_LINEDOWN:                        //下箭头
  88.                         if (si.nPos < 255)
  89.                                 ++si.nPos;
  90.                         break;

  91.                 case SB_THUMBTRACK:                        //滑块的拖动
  92.                         si.nPos = HIWORD(wParam);
  93.                         break;
  94.                 }
  95.                
  96.                 //根据ID来判断滚动条
  97.                 switch (GetDlgCtrlID((HWND)lParam))
  98.                 {
  99.                 case IDC_SCROLLBAR4:
  100.                         R = si.nPos;                //保存红色色号
  101.                         break;

  102.                 case IDC_SCROLLBAR5:        //保存绿色色号
  103.                         G = si.nPos;
  104.                         break;

  105.                 case IDC_SCROLLBAR6:        //保存蓝色色号
  106.                         B = si.nPos;
  107.                         break;
  108.                 }

  109.                 SetScrollInfo((HWND)lParam, SB_CTL, &si, TRUE);
  110.                 Ret = TRUE;
  111.                 break;

  112.         case WM_CLOSE:
  113.                 DestroyWindow(hDlg);
  114.                 Ret = TRUE;
  115.                 break;

  116.         case WM_DESTROY:
  117.                 SendMessage(GetParent(hDlg), WM_DESTROY, 0, 0);
  118.                 Ret = TRUE;
  119.                 break;
  120.         }

  121.         return Ret;
  122. }
复制代码


完成以上代码后我们的滚动条可以正常运行了HH,那我们接着实现 色号和滚动条背景颜色的功能吧

  1. INT_PTR _stdcall DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  2. {
  3.         BOOL Ret = FALSE;
  4.         int i = 0;
  5.         SCROLLINFO si;
  6.         si.cbSize = sizeof(SCROLLINFO);
  7.         static HBRUSH HVScrollBrush;

  8.         switch (message)
  9.         {
  10.         case WM_INITDIALOG:
  11.                 si.fMask = SIF_POS | SIF_RANGE;                //设置标志位
  12.                 si.nMin = 0;
  13.                 si.nMax = 255;                //设置滚动条的范围 0 - 255
  14.                 si.nPos = 0;
  15.                 for (i = IDC_SCROLLBAR4; i <= IDC_SCROLLBAR6; ++i)
  16.                         SetScrollInfo(GetDlgItem(hDlg, i), SB_CTL, &si, FALSE);
  17.                 //SetScrollInfo(hDlg, SB_VERT, &si, TRUE);
  18.                 Ret = TRUE;
  19.                 break;

  20.         case WM_CTLCOLORSTATIC:
  21.                 {
  22.                         TCHAR buf[128];
  23.                         BOOL Cheak = FALSE;                //标记位,只修改IDC_STATIC1 - IDC_STATIC3
  24.                         switch (GetDlgCtrlID((HWND)lParam))
  25.                         {
  26.                         case IDC_STATIC1:
  27.                                 wsprintf(buf, TEXT("%03d"), R);
  28.                                 Cheak = TRUE;
  29.                                 break;

  30.                         case IDC_STATIC2:
  31.                                 wsprintf(buf, TEXT("%03d"), G);
  32.                                 Cheak = TRUE;
  33.                                 break;

  34.                         case IDC_STATIC3:
  35.                                 wsprintf(buf, TEXT("%03d"), B);
  36.                                 Cheak = TRUE;
  37.                                 break;
  38.                         }
  39.                         if(Cheak)
  40.                                 SetWindowText((HWND)lParam, buf);
  41.                         Ret = TRUE;
  42.                 }
  43.                 break;

  44.                 case WM_CTLCOLORSCROLLBAR:
  45.                 switch (GetDlgCtrlID((HWND)lParam))                //根据ID来判断要更改的滚动条
  46.                 {
  47.                 case IDC_SCROLLBAR4:
  48.                         HVScrollBrush = CreateSolidBrush(RGB(R, 0, 0));                //创建画刷
  49.                         break;

  50.                 case IDC_SCROLLBAR5:
  51.                         HVScrollBrush = CreateSolidBrush(RGB(0, G, 0));                //创建画刷
  52.                         break;

  53.                 case IDC_SCROLLBAR6:
  54.                         HVScrollBrush = CreateSolidBrush(RGB(0, 0, B));                //创建画刷
  55.                         break;
  56.                 }
  57.                 return (LRESULT)HVScrollBrush;                                                //返回画刷句柄

  58.         case WM_VSCROLL:
  59.                 DeleteObject(HVScrollBrush);                                                //删除画刷
  60.                 si.fMask = SIF_POS;
  61.                 GetScrollInfo((HWND)lParam, SB_CTL, &si);
  62.                 switch (LOWORD(wParam))
  63.                 {
  64.                 case SB_LINEUP:                                //上箭头
  65.                         if (si.nPos > 0)
  66.                                 --si.nPos;
  67.                         break;

  68.                 case SB_LINEDOWN:                        //下箭头
  69.                         if (si.nPos < 255)
  70.                                 ++si.nPos;
  71.                         break;

  72.                 case SB_THUMBTRACK:                        //滑块的拖动
  73.                         si.nPos = HIWORD(wParam);
  74.                         break;
  75.                 }
  76.                
  77.                 //根据ID来判断滚动条
  78.                 switch (GetDlgCtrlID((HWND)lParam))
  79.                 {
  80.                 case IDC_SCROLLBAR4:
  81.                         R = si.nPos;                //保存红色色号,并重新绘制静态文本框
  82.                         InvalidateRect(GetDlgItem(hDlg, IDC_STATIC1), NULL, FALSE);
  83.                         break;

  84.                 case IDC_SCROLLBAR5:        //保存绿色色号,并重新绘制静态文本框
  85.                         G = si.nPos;
  86.                         InvalidateRect(GetDlgItem(hDlg, IDC_STATIC2), NULL, FALSE);
  87.                         break;

  88.                 case IDC_SCROLLBAR6:        //保存蓝色色号,并重新绘制静态文本框
  89.                         B = si.nPos;
  90.                         InvalidateRect(GetDlgItem(hDlg, IDC_STATIC3), NULL, FALSE);
  91.                         break;
  92.                 }

  93.                 SetScrollInfo((HWND)lParam, SB_CTL, &si, TRUE);
  94.                 Ret = TRUE;
  95.                 break;

  96.         case WM_CLOSE:
  97.                 DestroyWindow(hDlg);
  98.                 Ret = TRUE;
  99.                 break;

  100.         case WM_DESTROY:
  101.                 SendMessage(GetParent(hDlg), WM_DESTROY, 0, 0);
  102.                 Ret = TRUE;
  103.                 break;
  104.         }

  105.         return Ret;
  106. }
复制代码


传送门:对话框(非模式)调色板②
传送门:对话框(非模式)调色板④
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 18:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表