• 14364阅读
  • 12回复

【请教】关于Qt下使用WINDOWS API画图 [复制链接]

上一主题 下一主题
离线kaka_ace
 
只看楼主 正序阅读 楼主  发表于: 2011-04-06
由于课程实验,需要用WINDOWS的API来画图形,但不想用VS~~,
但在网上搜索解决方案时仍无果,按照网上的代码并未实现成功
代码如下:
/* 这是一个子WIDGET*/
#include"drawwidget.h"
#include<QtGui>
#include<QPainter>
#include<QString>
#ifdefQ_WS_WIN
#include<windows.h>
#include<winuser.h>
#include<wingdi.h>
#endif
初始时
setAttribute(Qt::WA_PaintOnScreen, true);
/* 先试一试网上的代码 */
voidDrawWidget::paintEvent(QPaintEvent*event)
{
    QPainter painter(this);
    
HDC hdc = painter.paintEngine()->getDC();
            HWND hwnd = this->winId();
    //使用WINDOWSGDI
    QString textmsg(tr("TestGDIPaint"));
             RECTrect1;
             GetClientRect(hwnd, &rect1);

             HBRUSH hbrRed = CreateSolidBrush(RGB(255, 0, 0));
            
FillRect(hdc, &rect1, hbrRed);
        HBRUSH hbrBlue = CreateSolidBrush(RGB(40, 40, 255));        
        HPEN bpenGreen = CreatePen(PS_SOLID, 4, RGB(0, 255, 0));
           SelectObject(hdc, bpenGreen);
     SelectObject(hdc, hbrBlue);
        
        Ellipse(hdc, 10, 10, rect1.right-20, rect1.bottom-20);
            SetTextAlign(hdc, TA_CENTER | TA_BASELINE);
           TextOutW(hdc, width()/2, height()/2, textmsg.toStdWString().c_str(), textmsg.size());
           ReleaseDC(hwnd,hdc);
}
编译报错信息为:
:: error: collect2: ld returned 1 exit status
盼指点迷津,非常感谢~~
[ 此帖被kaka_ace在2011-04-06 20:01重新编辑 ]
离线kaka_ace
只看该作者 12楼 发表于: 2011-04-07
解决了!谢谢各位大牛的帮助!
图书馆查阅了API大全
做了以下修改
将paintEngine值返回null
QPaintEngine *DrawWidget::paintEngine()const
{
    return 0;
}

HWND hwnd = this->winId();//子窗口
HDC hdc = GetDC(hwnd);
原先是
HDC hdc = painter.paintEngine()->getDC();
所以坐标出错,可能是获得DC后子部件默认在原点处,坐标被修改了
离线kaka_ace
只看该作者 11楼 发表于: 2011-04-07
回 9楼(wxj120bw) 的帖子
HWND从子widget->winId那获取,但生成的图像却以父widget那为起点描绘的,子部件起始坐标应该在窗口下方,是否HWND变量获得的是整个窗口的id?
离线kaka_ace
只看该作者 10楼 发表于: 2011-04-07
回 9楼(wxj120bw) 的帖子
HWND从子widget->winId那获取,但生成的图像却以父widget那为起点描绘的,子部件起始坐标应该在窗口下方,是否HWND变量获得的是整个窗口的id?
离线wxj120bw

只看该作者 9楼 发表于: 2011-04-07
Re:回 6楼(dbzhang800) 的帖子
引用第8楼kaka_ace于2011-04-06 22:08发表的 回 6楼(dbzhang800) 的帖子 :
噢~~~原来加的是-LGDI32~~囧,把相应的改为小写编译通过了~~,谢谢。。。。。。
新问题又出现了,我的想法是在子控件的WIDGET画图,但效果是覆盖了上部分,在父窗口的WIDGET初始中设定了子部件drawWidget->setGeometry(20, 220, 601, 341);如此的坐标,
原来使用QT自己的画图函数运行正常,而调用API时效果为以坐标原点0,0开始~~
句柄代码应该如何使用?

句柄代码应该如何使用?句柄代码指什么,sdk绘图没太多接触。

离线kaka_ace
只看该作者 8楼 发表于: 2011-04-06
回 6楼(dbzhang800) 的帖子
噢~~~原来加的是-LGDI32~~囧,把相应的改为小写编译通过了~~,谢谢。。。。。。
新问题又出现了,我的想法是在子控件的WIDGET画图,但效果是覆盖了上部分,在父窗口的WIDGET初始中设定了子部件drawWidget->setGeometry(20, 220, 601, 341);如此的坐标,
原来使用QT自己的画图函数运行正常,而调用API时效果为以坐标原点0,0开始~~
句柄代码应该如何使用?
离线wxj120bw

只看该作者 7楼 发表于: 2011-04-06
Re:回 4楼(wxj120bw) 的帖子
引用第5楼kaka_ace于2011-04-06 21:35发表的 回 4楼(wxj120bw) 的帖子 :
这个格式该如何写?还是新手~~,LIB文件放在工程目录下吗?

具体查看楼上的方法
离线dbzhang800

只看该作者 6楼 发表于: 2011-04-06
Re:回 4楼(wxj120bw) 的帖子
引用第5楼kaka_ace于2011-04-06 21:35发表的 回 4楼(wxj120bw) 的帖子 :
这个格式该如何写?还是新手~~,LIB文件放在工程目录下吗?

你没有连接必须的库,比如 Gdi32.lib 等,在你的pro文件内添加: LIBS += -lGdi32 等语句,建议适当看看qmake的manual
离线kaka_ace
只看该作者 5楼 发表于: 2011-04-06
回 4楼(wxj120bw) 的帖子
这个格式该如何写?还是新手~~,LIB文件放在工程目录下吗?
离线wxj120bw

只看该作者 4楼 发表于: 2011-04-06
引用第3楼kaka_ace于2011-04-06 20:58发表的  :
如下:~~抱歉
debug/drawwidget.o:F:\drawYouLike-build-desktop/../drawYouLike/drawwidget.cpp:41: undefined reference to `CreateSolidBrush@4'
debug/drawwidget.o:F:\drawYouLike-build-desktop/../drawYouLike/drawwidget.cpp:43: undefined reference to `CreateSolidBrush@4'
.......

少了库文件的配置,在pro添加win32:libs += -l*** 这样配置
离线kaka_ace
只看该作者 3楼 发表于: 2011-04-06
如下:~~抱歉
debug/drawwidget.o:F:\drawYouLike-build-desktop/../drawYouLike/drawwidget.cpp:41: undefined reference to `CreateSolidBrush@4'

debug/drawwidget.o:F:\drawYouLike-build-desktop/../drawYouLike/drawwidget.cpp:43: undefined reference to `CreateSolidBrush@4'

debug/drawwidget.o:F:\drawYouLike-build-desktop/../drawYouLike/drawwidget.cpp:44: undefined reference to `CreatePen@12'

debug/drawwidget.o:F:\drawYouLike-build-desktop/../drawYouLike/drawwidget.cpp:45: undefined reference to `SelectObject@8'

debug/drawwidget.o:F:\drawYouLike-build-desktop/../drawYouLike/drawwidget.cpp:46: undefined reference to `SelectObject@8'

debug/drawwidget.o:F:\drawYouLike-build-desktop/../drawYouLike/drawwidget.cpp:49: undefined reference to `Ellipse@20'

debug/drawwidget.o:F:\drawYouLike-build-desktop/../drawYouLike/drawwidget.cpp:50: undefined reference to `SetTextAlign@8'

debug/drawwidget.o:F:\drawYouLike-build-desktop/../drawYouLike/drawwidget.cpp:51: undefined reference to `TextOutW@20'

collect2: ld returned 1 exit status

mingw32-make[1]: *** [debug\drawYouLike.exe] Error 1

mingw32-make: *** [debug] Error 2

The process "D:/QT/2010myQT/mingw/bin/mingw32-make.exe" exited with code %2.
Error while building project drawYouLike (target: Desktop)
When executing build step 'Make'
离线dbzhang800

只看该作者 2楼 发表于: 2011-04-06
贴具体的出错信息。你前面给的错误信息仅能告诉大家链接出现了问题。
离线kaka_ace
只看该作者 1楼 发表于: 2011-04-06
IDE 为 Qt Creator (4.7版本)
快速回复
限100 字节
 
上一个 下一个