鱼C论坛

 找回密码
 立即注册
查看: 4810|回复: 19

求API设置画笔属性函数

[复制链接]
发表于 2011-10-29 13:01:10 | 显示全部楼层 |阅读模式

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

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

x
求API设置画笔属性函数

另外,SetDCPenColor这个函数有什么使用限制,
为什么我调用时提示警告:'SetDCPenColor' undefined; assuming extern returning int
链接时提示错误:unresolved external symbol _SetDCPenColor   
                            1 unresolved externals


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-29 13:44:22 | 显示全部楼层
本帖最后由 yipwing 于 2011-10-29 13:45 编辑

MSDN的例子,使用这个函数必须包含Wingdi.h
你看看..
  1. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  2. {
  3.     int wmId, wmEvent;
  4.     PAINTSTRUCT ps;
  5.     HDC hdc;

  6.     switch (message)
  7.     {
  8.     case WM_COMMAND:
  9.         wmId    = LOWORD(wParam);
  10.         wmEvent = HIWORD(wParam);
  11.         // Parse the menu selections:
  12.         switch (wmId)
  13.         {
  14.         case IDM_ABOUT:
  15.             DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
  16.             break;
  17.         case IDM_EXIT:
  18.             DestroyWindow(hWnd);
  19.             break;
  20.         default:
  21.             return DefWindowProc(hWnd, message, wParam, lParam);
  22.         }
  23.         break;
  24.     case WM_PAINT:
  25.         
  26.         {   
  27.             hdc = BeginPaint(hWnd, &ps);
  28.         //    Initializing original object
  29.             HGDIOBJ original = NULL;
  30.         
  31.         //    Saving the original object
  32.             original = SelectObject(hdc,GetStockObject(DC_PEN));

  33.         //    Rectangle function is defined as...
  34.         //    BOOL Rectangle(hdc, xLeft, yTop, yRight, yBottom);
  35.    
  36.         //    Drawing a rectangle with just a black pen
  37.         //    The black pen object is selected and sent to the current device context
  38.         //  The default brush is WHITE_BRUSH
  39.             SelectObject(hdc, GetStockObject(BLACK_PEN));
  40.             Rectangle(hdc,0,0,200,200);

  41.         //    Select DC_PEN so you can change the color of the pen with
  42.         //    COLORREF SetDCPenColor(HDC hdc, COLORREF color)
  43.             SelectObject(hdc, GetStockObject(DC_PEN));

  44.         //    Select DC_BRUSH so you can change the brush color from the
  45.         //    default WHITE_BRUSH to any other color
  46.             SelectObject(hdc, GetStockObject(DC_BRUSH));

  47.         //    Set the DC Brush to Red
  48.         //    The RGB macro is declared in "Windowsx.h"
  49.             SetDCBrushColor(hdc, RGB(255,0,0));

  50.         //    Set the Pen to Blue
  51.             SetDCPenColor(hdc, RGB(0,0,255));
  52.         
  53.         //    Drawing a rectangle with the current Device Context   
  54.             Rectangle(hdc,100,300,200,400);

  55.         //    Changing the color of the brush to Green
  56.             SetDCBrushColor(hdc, RGB(0,255,0));
  57.             Rectangle(hdc,300,150,500,300);

  58.         //    Restoring the original object
  59.             SelectObject(hdc,original);

  60.         // It is not necessary to call DeleteObject to delete stock objects.
  61.         }
  62.         
  63.         break;
  64.     case WM_DESTROY:
  65.         PostQuitMessage(0);
  66.         break;
  67.     default:
  68.         return DefWindowProc(hWnd, message, wParam, lParam);
  69.     }
  70.     return 0;
  71. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-10-29 17:30:29 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-10-29 17:31:42 | 显示全部楼层
加了wingdi.h结果一样。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-29 17:52:30 | 显示全部楼层
Mr.C 发表于 2011-10-29 17:31
加了wingdi.h结果一样。

我的MSDN是微软MSDN官方网站上的..
关于你这个函数的地址:
http://msdn.microsoft.com/zh-cn/site/dd162970
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-10-29 17:55:30 | 显示全部楼层
yipwing 发表于 2011-10-29 17:52
我的MSDN是微软MSDN官方网站上的..
关于你这个函数的地址:
http://msdn.microsoft.com/zh-cn/site/dd16 ...

Requirements
Minimum supported client
Windows 2000 Professional
Minimum supported server
Windows 2000 Server
Header
Wingdi.h (include Windows.h)
Library
Gdi32.lib
DLL
Gdi32.dll
问题是出在系统上吧。我XP的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-29 17:57:24 | 显示全部楼层
你把代码贴上来,我编译下看看?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-29 18:53:25 | 显示全部楼层
加上
#pragma comment(lib,"Gdi32.lib")
试试看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-10-29 18:55:44 | 显示全部楼层
yipwing 发表于 2011-10-29 17:57
你把代码贴上来,我编译下看看?
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <wingdi.h>
  4. #define WM_MYMSG WM_USER+1
  5. #pragma comment(lib,"Gdi32.lib")
  6. LRESULT CALLBACK ShineProc(HWND hWnd,
  7.                                                    UINT uMsg,
  8.                                                    WPARAM wParam,
  9.                                                    LPARAM lParam);
  10. int WINAPI WinMain( HINSTANCE hInstance,
  11.                                    HINSTANCE hPrevInstance,
  12.                                    LPSTR lpCmdLine,
  13.                                    int nShowCmd)
  14. {
  15.         HWND hwnd;
  16.         MSG msg;
  17.         WNDCLASS wnd;
  18.         wnd.cbClsExtra = 0;
  19.         wnd.cbWndExtra = 0;
  20.         wnd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  21.         wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
  22.         wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  23.         wnd.hInstance = hInstance;
  24.         wnd.lpfnWndProc = ShineProc;
  25.         wnd.lpszClassName = "shine";
  26.         wnd.lpszMenuName = NULL;
  27.         wnd.style = CS_HREDRAW | CS_VREDRAW;
  28.        
  29.         if(!RegisterClass(&wnd))
  30.         {
  31.                 MessageBox(NULL, "Register Fail", "Warning", MB_OK);
  32.                 return 0;
  33.         }
  34.         hwnd = CreateWindow( "shine", "MyWindowDemo", WS_OVERLAPPEDWINDOW,
  35.                 10, 10, 600, 500, NULL, NULL, hInstance, 0);
  36.         ShowWindow(hwnd, SW_SHOWNORMAL);
  37.        
  38.         while(GetMessage(&msg, NULL, 0, 0))
  39.         {
  40.                 TranslateMessage(&msg);
  41.                 DispatchMessage(&msg);
  42.         }
  43.         return 0;
  44. }
  45. //全局变量区
  46. HDC hdc_draw;
  47. COLORREF currentcrf;
  48. HWND hwnd_temp;
  49. //全局变量区
  50. POINT pt = {0};
  51. LRESULT CALLBACK ShineProc(HWND hWnd,
  52.                                                    UINT uMsg,
  53.                                                    WPARAM wParam,
  54.                                                    LPARAM lParam)
  55. {
  56.         //变量定义区
  57.         HDC hdc_text;
  58.         char str[20] = TEXT("自制画图器");
  59.         PAINTSTRUCT ps;
  60.         RECT rect;
  61.         LOGFONT lf = {0};
  62.         CHOOSECOLOR cc = {0};
  63.         COLORREF crf[16] = {0};

  64.         //变量定义区
  65.         switch(uMsg)
  66.         {
  67.         case WM_LBUTTONDOWN:
  68.                 hdc_draw = GetDC(hWnd);
  69.                 pt.x = LOWORD(lParam);
  70.                 pt.y = HIWORD(lParam);
  71.                 break;
  72.         case WM_MOUSEMOVE:
  73.                         MoveToEx(hdc_draw, pt.x, pt.y, NULL);
  74.                         LineTo(hdc_draw, LOWORD(lParam), HIWORD(lParam));
  75.                         pt.x = LOWORD(lParam);
  76.                         pt.y = HIWORD(lParam);
  77.                 break;
  78.         case WM_LBUTTONUP:
  79.                 ReleaseDC(hWnd, hdc_draw);
  80.                 break;
  81.         case WM_CHAR:
  82.                 switch(wParam)
  83.                 {
  84.                 case 'b':
  85.                 case 'B':
  86.                         cc.lStructSize = sizeof(CHOOSECOLOR);
  87.                         cc.lpCustColors = crf;
  88.                         cc.Flags = CC_FULLOPEN;
  89.                         ChooseColor(&cc);
  90.                         SetDCPenColor(hdc_draw, RGB(255,0,0));
  91.                        
  92.                         break;
  93.                 }
  94.                 break;
  95.         case WM_PAINT:
  96.                 hdc_text = BeginPaint(hWnd, &ps);
  97.                 SetTextColor(hdc_text, RGB(0, 0, 255));
  98.                 GetWindowRect(hWnd, &rect);
  99.                 lf.lfHeight = 50;
  100.                 lf.lfUnderline = 1;
  101.                 SelectObject(hdc_text, CreateFontIndirect(&lf));
  102.                 TextOut(hdc_text, (rect.right-rect.left)/2-120 , 10, str, strlen(str));
  103.                 EndPaint(hWnd, &ps);
  104.                 break;
  105.         case WM_DESTROY:
  106.                 PostQuitMessage(0);
  107.                 break;
  108.         }
  109.         return DefWindowProc(hWnd, uMsg, wParam, lParam);
  110. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-10-29 18:59:47 | 显示全部楼层
这段代码纯手工写的, 按B键弹出调色器,然后绘指定颜色线条。
SetDCPenColor(hdc_draw, cc.rgbResult);或
SetDCPenColor(hdc_draw, RGB(255,0,0));

SetDCPenColor一直提示出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-10-29 19:07:01 | 显示全部楼层
cqy55555 发表于 2011-10-29 18:53
加上
#pragma comment(lib,"Gdi32.lib")
试试看

这段加上了,结果一样。代码我贴上面了,你编译一下,是不是报错。没理由的啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-10-29 19:13:07 | 显示全部楼层
上面的代码,有人可以编译通过吗? 或者可以说明错误原因吗?
冰天雪地旋转三百六十五度坐等答案。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-29 19:31:02 | 显示全部楼层
本帖最后由 yipwing 于 2011-10-29 19:36 编辑
Mr.C 发表于 2011-10-29 19:13
上面的代码,有人可以编译通过吗? 或者可以说明错误原因吗?
冰天雪地旋转三百六十五度坐等答案。 ...

你等会,我编译下..
编译没错,但是功能没用..

你等下,我在改改代码试试...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-10-29 19:39:23 | 显示全部楼层
yipwing 发表于 2011-10-29 19:31
你等会,我编译下..
编译没错,但是功能没用..

为什么我编译警告,链接报错。VC6.0啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-29 19:53:57 | 显示全部楼层
Mr.C 发表于 2011-10-29 19:39
为什么我编译警告,链接报错。VC6.0啊

debug了下,发现你hcd_draw里面没值...

顺便说下,我系统是win7 64 编译环境是vs2010sp1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-29 20:28:40 | 显示全部楼层
本帖最后由 yipwing 于 2011-10-29 21:28 编辑

楼主你看看,虽然还有问题,不过,你应该能明白..
以下是我改过后的代码...  代码有个问题,就是在按下B键后设置的颜色才正常能用..但是鼠标按下后又会变回黑色...(这个你应该明白了吧??)
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <wingdi.h>
  4. #include <Windowsx.h>
  5. #define WM_MYMSG WM_USER+1
  6. #pragma comment(lib,"Gdi32.lib")

  7. LRESULT CALLBACK ShineProc(HWND hWnd,
  8.         UINT uMsg,
  9.         WPARAM wParam,
  10.         LPARAM lParam);
  11. int WINAPI WinMain( HINSTANCE hInstance,
  12.         HINSTANCE hPrevInstance,
  13.         LPSTR lpCmdLine,
  14.         int nShowCmd)
  15. {
  16.         HWND hwnd;
  17.         MSG msg;
  18.         WNDCLASS wnd;
  19.         wnd.cbClsExtra = 0;
  20.         wnd.cbWndExtra = 0;
  21.         wnd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  22.         wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
  23.         wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  24.         wnd.hInstance = hInstance;
  25.         wnd.lpfnWndProc = ShineProc;
  26.         wnd.lpszClassName = "shine";
  27.         wnd.lpszMenuName = NULL;
  28.         wnd.style = CS_HREDRAW | CS_VREDRAW;

  29.         if(!RegisterClass(&wnd))
  30.         {
  31.                 MessageBox(NULL, "Register Fail", "Warning", MB_OK);
  32.                 return 0;
  33.         }
  34.         hwnd = CreateWindow( "shine", "MyWindowDemo", WS_OVERLAPPEDWINDOW,
  35.                 10, 10, 600, 500, NULL, NULL, hInstance, 0);
  36.         ShowWindow(hwnd, SW_SHOWNORMAL);

  37.         while(GetMessage(&msg, NULL, 0, 0))
  38.         {
  39.                 TranslateMessage(&msg);
  40.                 DispatchMessage(&msg);
  41.         }
  42.         return 0;
  43. }
  44. //全局变量区
  45. HDC hdc_draw;
  46. COLORREF currentcrf;
  47. HWND hwnd_temp;
  48. //全局变量区
  49. POINT pt = {0};
  50. LRESULT CALLBACK ShineProc(HWND hWnd,
  51.         UINT uMsg,
  52.         WPARAM wParam,
  53.         LPARAM lParam)
  54. {
  55.         //变量定义区
  56.         HDC hdc_text;
  57.         char str[20] = TEXT("自制画图器");
  58.         PAINTSTRUCT ps;
  59.         RECT rect;
  60.         LOGFONT lf = {0};
  61.         CHOOSECOLOR cc = {0};
  62.         COLORREF crf[16] = {0};

  63.         //变量定义区
  64.         switch(uMsg)
  65.         {
  66.                
  67.         case WM_LBUTTONDOWN:
  68.                 hdc_draw = GetDC(hWnd);
  69.                 if (hdc_draw==NULL)
  70.                 {
  71.                         MessageBox(hWnd,"some thing error","Oops",MB_OK);
  72.                 }
  73.                 pt.x = LOWORD(lParam);
  74.                 pt.y = HIWORD(lParam);
  75.                 break;
  76.         case WM_MOUSEMOVE:
  77.                 MoveToEx(hdc_draw, pt.x, pt.y, NULL);
  78.                 LineTo(hdc_draw, LOWORD(lParam), HIWORD(lParam));
  79.                 pt.x = LOWORD(lParam);
  80.                 pt.y = HIWORD(lParam);
  81.                 break;
  82.         case WM_LBUTTONUP:
  83.                 ReleaseDC(hWnd, hdc_draw);   //鼠标弹起按键后,释放了DC..
  84.                 break;
  85.         case WM_CHAR:
  86.                 switch(wParam)
  87.                 {
  88.                 case 'b':
  89.                 case 'B':
  90.                         hdc_draw = GetDC(hWnd);        //重新设置DC
  91.                         cc.lStructSize = sizeof(CHOOSECOLOR);
  92.                         cc.lpCustColors = crf;
  93.                         cc.Flags = CC_FULLOPEN;
  94.                         ChooseColor(&cc);
  95.                         SelectObject(hdc_draw, GetStockObject(DC_PEN));
  96.                         if (SetDCPenColor(hdc_draw, RGB(0,0,255))==CLR_INVALID)
  97.                         {
  98.                                 MessageBox(hWnd,"error","oops..",MB_OK);
  99.                         }
  100.                         break;
  101.                         ReleaseDC(hWnd,hdc_draw);
  102.                 }
  103.                 break;
  104.         case WM_PAINT:
  105.                 hdc_text = BeginPaint(hWnd, &ps);
  106.                 SetTextColor(hdc_text, RGB(0, 0, 255));
  107.                 GetWindowRect(hWnd, &rect);
  108.                 lf.lfHeight = 50;
  109.                 lf.lfUnderline = 1;
  110.                 SelectObject(hdc_text, CreateFontIndirect(&lf));
  111.                 TextOut(hdc_text, (rect.right-rect.left)/2-120 , 10, str, strlen(str));
  112.                 EndPaint(hWnd, &ps);
  113.                 break;
  114.         case WM_DESTROY:
  115.                 PostQuitMessage(0);
  116.                 break;
  117.         }
  118.         return DefWindowProc(hWnd, uMsg, wParam, lParam);
  119. }
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-10-29 22:08:48 | 显示全部楼层
你改后的代码,在我机子上,
'DC_PEN' : undeclared identifier
'SetDCPenColor' undefined; assuming extern returning int
我想是不是我的编译器有问题。
你指出的hdc_draw确实有问题,WM_LBUTTONUP消息之后,hdc_draw被关闭,又变黑色了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-29 23:27:14 | 显示全部楼层
windows7 下VC6.0
可作如下修改:
将:
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <wingdi.h>
  4. #define WM_MYMSG WM_USER+1
  5. #pragma comment(lib,"Gdi32.lib")
复制代码
改为:
  1. #define _WIN32_WINNT 0x0502
  2. #include <windows.h>
  3. #include <stdio.h>
  4. #include <wingdi.h>
  5. #define WM_MYMSG WM_USER+1
  6. #pragma comment(lib,"Gdi32.lib")
复制代码
即在开头加上
#define _WIN32_WINNT 0x0502
以说明你的操作系统版本号。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-29 23:29:43 | 显示全部楼层
原因如下:
打开文件wingdi.h
ctrl+f找 SetDCPenColor
得到
#if (_WIN32_WINNT >= 0x0500)
WINGDIAPI COLORREF WINAPI SetDCBrushColor(HDC, COLORREF);
WINGDIAPI COLORREF WINAPI SetDCPenColor(HDC, COLORREF);
#endif

说明至少要把_WIN32_WINNT 设置得等于0x0500
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-10-29 23:31:10 | 显示全部楼层
仰望天上的光 发表于 2011-10-29 23:29
原因如下:
打开文件wingdi.h
ctrl+f找 SetDCPenColor

受教了。3Q
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-3-29 01:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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