C++Builder 程序员博客
29 Aug
void __fastcall TForm1::DrawGrid()
{
for(int i=0;i<19;i++)
for(int j=0;j<19;j++)
DrawCell(i,j,Cell[i][j],0);
}
void __fastcall TForm1::DrawCell(int i,int j,int cell,int t)
{
TRect MyRect;
MyRect=DrawGrid1->CellRect(j,i);
if(cell==0)
{
DrawGrid1->Canvas->Draw(MyRect.Left,MyRect.Top,a);
}
else if(cell==1)
{
DrawGrid1->Canvas->Draw(MyRect.Left,MyRect.Top,b);
}
else if(cell==2)
DrawGrid1->Canvas->Draw(MyRect.Left,MyRect.Top,c);
}a,b,c都是bmp
初始化for(int i=0;i<19;i++)
for(int j=0;j<19;j++)
Cell[i][j]=0;
Cell[9][9]=1;
在调用DrawGrid,可是不能显示图片
没看到你调用DrawGrid函数地方啊。
在程序开始的时候就调用了,在FormCreate的时候就调用了,就是不能在DrawGrid显示图片,不知怎么回事
<
Image1->Canvas->Draw(MyRect.Left,MyRect.Top,c);
用Image就能载入图片,不知道DrawGrid咋就不能…
在FormCreate中调用是没有意义的。窗口一刷新就没有了。
将你的代码改一改,然后在DrawGrid的OnDrawCell事件中调用。
<
<
Timage自己处理了刷新,DrawGrid需要在刷新事件处理,你试着在Form的OnPait事件里写上那段代码看看。
15 Aug
我想在软件运行前,显示一张图片,图片显示3秒后关闭,或者,点击鼠标后关闭。但我用如下代码,只实现了点击鼠标后关闭,不点击鼠标的话,就一直显示在那,为什么?
//—————————————————————————
void __fastcall TForm10::Image1Click(TObject *Sender)
{
Close();
}
//—————————————————————————
void __fastcall TForm10::FormActivate(TObject *Sender)
{
Sleep(3000);
Close();
}
//—————————————————————————
我将
Sleep(3000);
Close();
加到FormCreate中也不行。请各位朋友指教,谢谢!
你是想实现 在系统弹出登陆界面: 就是输入用户名、密码框, 前显示一些公司的log 图片吧?
这样你可以 新建一个窗体 上面放你的图片
然后做个定时器 去定时关闭 然后启动登陆界面
这个做法跟登陆界面方法差不多的
如果是单纯的在系统主界面 显示图片 然后关闭
你直接做个定时器 过了时间就把图片隐藏
就是把iamge 的Visable 改成false 就可以了
BCB带有LOGO窗口的呀!
<
BCB的那LOGO窗口实在丑陋
FormActivate事件用的不对吧?当焦点转移到Form上时才触发这个事件,你加个断点调一下就看到了。所以你用鼠标点一下Form,我想也能把图片关闭。
我没试,你试试吧。
<
用TTimer控件,解决了问题,谢谢!
3 Aug
设置dbedit,让dbedit不用输入数据而是显示程序中的某一运算结果a并将a的值保存到数据库中
怎么没人帮忙啊
直接用普通的EDIT就可以了吧,你计算完了以后,直接设置它的TEXT,然后insert到数据库里就OK喽
DbEdit->ReadOnly = true;
设置为只读,或者使用dbText,只作为显示
Dbedit现在可以显示某一运算结果但是为什么保存不到数据库呢,数据库中对应的字段数据值都是0
<
用了,dbedit的readonly设置了ture还是存不进数据库去,数据库中对应字段都是0
2 Aug
下面的代码我想大家都见过 是读取TrueType字体结构的代码,我现在用他读取的轮廓感觉比较粗糙,锯齿多,不够圆滑,请问有什么方法可以修正 或者有更好的算法,请赐教,谢谢
pCanvas->Font->Size =80;
pCanvas->Font->Name="宋体";
pCanvas->Pen->Color = clBlack;
pCanvas->Pen->Mode = pmCopy;
pCanvas->Pen->Style = psSolid;
pCanvas->Pen->Width = 1;
int XSize = ClipRect.Width() / Text.Length();
int YSize = ClipRect.Height();
MAT2 mat2; // 转置矩阵,不用变换
mat2.eM11.value = 1;mat2.eM11.fract = 0;
mat2.eM12.value = 0;mat2.eM12.fract = 0;
mat2.eM21.value = 0;mat2.eM21.fract = 0;
mat2.eM22.value = 1;mat2.eM22.fract = 0;
GLYPHMETRICS gm,gmm;
// 首先获得字符的位置矩阵,存入gm
GetGlyphOutlineA(pCanvas->Handle,0×0b0a1,
GGO_METRICS,&gm,0,NULL,&mat2);
char *ptr = Text.c_str();
TRect TheRect;
for(int i = 0;i < Text.Length();) {
int c1 = (unsigned char)*ptr;
int c2 = (unsigned char)*(ptr + 1);
UINT nChar;
TheRect.Left = i * XSize + ClipRect.Left;
TheRect.Top = ClipRect.Top;
TheRect.Right = (i + 2) * XSize + ClipRect.Left;
TheRect.Bottom = ClipRect.Top + YSize;
if(c1 > 127) { // 当前字符是汉字
nChar = c1 * 256 + c2;
ptr+=2;i+=2;
}
else { // 字母或数字
nChar = c1;
ptr++;i++;
}
// 获得当前字符数据的数组的大小
DWORD cbBuffer = GetGlyphOutlineA(pCanvas->
Handle,nChar,GGO_NATIVE,&gmm,0,NULL,&mat2);
if(cbBuffer == GDI_ERROR) break;
void *lpBuffer = malloc(cbBuffer);
if(lpBuffer != NULL) {
// 读入数据置缓冲区
if(GetGlyphOutlineA(pCanvas->
Handle,nChar,GGO_NATIVE,
&gmm,cbBuffer,lpBuffer,&mat2) != GDI_ERROR) {
// 分析数据并绘制字符
TMemoryStream *MBuffer = new TMemoryStream();
MBuffer->Write(lpBuffer,cbBuffer);
MBuffer->Position = 0;
for(;MBuffer->Position < MBuffer->Size;) {
int CurPos = MBuffer->Position;
TTPOLYGONHEADER polyheader;
int ptn = 0;
MBuffer->Read(&polyheader,sizeof(polyheader));
ptn++;
for(int j = 0;j < (int)(polyheader.cb
- sizeof(polyheader));) {
WORD wtype,cpfx;
MBuffer->Read(&wtype,sizeof(WORD));
MBuffer->Read(&cpfx,sizeof(WORD));
MBuffer->Position += cpfx * sizeof(POINTFX);
j += sizeof(WORD) * 2 + cpfx * sizeof(POINTFX);
if(wtype == TT_PRIM_LINE) ptn += cpfx;
else ptn += (cpfx - 1) * 3 + 1;
}
TPoint *pts = new TPoint[ptn+1]; // 存储多边形顶点
MBuffer->Position = CurPos;
ptn = 0;
MBuffer->Read(&polyheader,sizeof(polyheader));
TPoint pt0 = POINTFX2TPoint(polyheader.pfxStart,TheRect,&gm);
pts[ptn++] = pt0;
for(int j = 0;j < (int)(polyheader.cb - sizeof(polyheader));) {
TPoint pt1;
WORD wtype,cpfx;
MBuffer->Read(&wtype,sizeof(WORD));
MBuffer->Read(&cpfx,sizeof(WORD));
POINTFX *pPfx = new POINTFX[cpfx];
MBuffer->Read((void *)pPfx,cpfx * sizeof(POINTFX));
j += sizeof(WORD) * 2 + cpfx * sizeof(POINTFX);
if(wtype == TT_PRIM_LINE) { // 直线段
for(int i = 0;i < cpfx;i++) {
pt1 = POINTFX2TPoint(pPfx[i],TheRect,&gm);
pts[ptn++] = pt1;
}
}
else { // Bezier曲线
TPoint p0,p1,p2,p3,p11,p22,pp0,pp1,pp2,pt11,pt22;
int i;
for(i = 0;i < cpfx-1;i++) {
pt11 = POINTFX2TPoint(pPfx[i],TheRect,&gm);
pt22 = POINTFX2TPoint(pPfx[i+1],TheRect,&gm);
pp0 = pts[ptn-1];
pp1 = pt11;
pp2.x = (pt11.x + pt22.x)/2;
pp2.y = (pt11.y + pt22.y)/2;
p0 = pp0;
p1.x = pp0.x/3 + 2 * pp1.x/3;
p1.y = pp0.y/3 + 2 * pp1.y/3;
p2.x = 2 * pp1.x/3 + pp2.x/3;
p2.y = 2 * pp1.y/3 + pp2.y/3;
p3 = pp2;
for(float t = 0.0f;t <= 1.0f;t += 0.5f) {
float x = (1-t)*(1-t)*(1-t)*p0.x+
3*t*(1-t)*(1-t)*p1.x+ 3*t*t
*(1-t)*p2.x + t*t*t*p3.x;
float y = (1-t)*(1-t)*(1-t)*p0.y
+ 3*t*(1-t)*(1-t)*p1.y+3
*t*t*(1-t)*p2.y + t*t*t*p3.y;
pts[ptn].x = x;
pts[ptn].y = y;
ptn++;
}
}
pt1 = POINTFX2TPoint(pPfx[i],TheRect,&gm);
pts[ptn++] = pt1;
}
delete pPfx;
}
pts[ptn] = pts[0]; // 封闭多边形
pCanvas->Brush->Color = clWhite;
pCanvas->Pen->Mode = pmXor;
pCanvas->Pen->Style = psClear;
pCanvas->Brush->Style = bsSolid;
pCanvas->Polygon(pts,ptn);
delete pts;
}
delete MBuffer;
}
free(lpBuffer);
}
不懂,帮顶,学习
还是用GDI+吧
我需要生成字体的轮廓,然后自己来进行填充
我想用GDI+来做 顺便学习下 以前没接触过 ,妖哥能否给提供GDI+中相关的几个函数呢,最好能帮忙分析下用GDI实现的可行性 谢谢
还有个疑问 我在使用GDI的时候
定义了全局变量
Gdiplus::Graphics *graphics;
然后在FormShow中new
graphics=new Gdiplus::Graphics(Image1->Canvas->Handle);
但是在其他函数中调用的时候没有正常显示
void __fastcall TFGDI::Button4Click(TObject *Sender)
{
graphics->DrawBezier(myPen, 0, 0, 40, 20, 80, 150, 100, 10);
}
如果在函数内部new 则可以 不知如何解决
void __fastcall TFGDI::Button4Click(TObject *Sender)
{
graphics=new Gdiplus::Graphics(Image1->Canvas->Handle);
graphics->DrawBezier(myPen, 0, 0, 40, 20, 80, 150, 100, 10);
}
5 Jul
我把biHelp设为true,显示那个带?号的按钮
用 Msg.WParam == SC_CONTEXTHELP 来判断这个按钮点击
弹出我的一个帮助窗体,但在关闭这个窗体后,鼠标的图标就是一个问号,
需要再次单击一次才变回原来的箭头,如何不让鼠标图标变为问号?
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// 还原默认光标
Cursor = crDefault;
}
//—————————————————————————
void __fastcall TForm1::Button2Click(TObject *Sender)
{
// 设置为帮助提示光标
Cursor = crHelp;
}
//—————————————————————————
妖哥 正解
是不是在窗体的构造函数里加上一句: FrmMain->WindowProc = WndProc;
我开始是拦截消息
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_SYSCOMMAND,TMessage,OnWMSysCommand) //TWMMenuSelect
END_MESSAGE_MAP(TForm);
//————————————————————
void __fastcall TFrmMain::OnWMSysCommand(TMessage &Msg)
{
if(Msg.WParam == SC_CONTEXTHELP)
{
// 在此处弹出你的帮助窗体
}
TForm::Dispatch(&Msg);
}
这种方法不能直接return吧
嗯,好贴要留名!· 哈哈
下面正好要用这个,学习啦
嗯,学习了
5 Jul
我把biHelp设为true,显示那个带?号的按钮
用 Msg.WParam == SC_CONTEXTHELP 来判断这个按钮点击
弹出我的一个帮助窗体,但在关闭这个窗体后,鼠标的图标就是一个问号,
需要再次单击一次才变回原来的箭头,如何不让鼠标图标变为问号?
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// 还原默认光标
Cursor = crDefault;
}
//—————————————————————————
void __fastcall TForm1::Button2Click(TObject *Sender)
{
// 设置为帮助提示光标
Cursor = crHelp;
}
//—————————————————————————
妖哥 正解
是不是在窗体的构造函数里加上一句: FrmMain->WindowProc = WndProc;
我开始是拦截消息
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_SYSCOMMAND,TMessage,OnWMSysCommand) //TWMMenuSelect
END_MESSAGE_MAP(TForm);
//————————————————————
void __fastcall TFrmMain::OnWMSysCommand(TMessage &Msg)
{
if(Msg.WParam == SC_CONTEXTHELP)
{
// 在此处弹出你的帮助窗体
}
TForm::Dispatch(&Msg);
}
这种方法不能直接return吧
嗯,好贴要留名!· 哈哈
下面正好要用这个,学习啦
嗯,学习了
5 Jul
我把biHelp设为true,显示那个带?号的按钮
用 Msg.WParam == SC_CONTEXTHELP 来判断这个按钮点击
弹出我的一个帮助窗体,但在关闭这个窗体后,鼠标的图标就是一个问号,
需要再次单击一次才变回原来的箭头,如何不让鼠标图标变为问号?
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// 还原默认光标
Cursor = crDefault;
}
//—————————————————————————
void __fastcall TForm1::Button2Click(TObject *Sender)
{
// 设置为帮助提示光标
Cursor = crHelp;
}
//—————————————————————————
妖哥 正解
是不是在窗体的构造函数里加上一句: FrmMain->WindowProc = WndProc;
我开始是拦截消息
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_SYSCOMMAND,TMessage,OnWMSysCommand) //TWMMenuSelect
END_MESSAGE_MAP(TForm);
//————————————————————
void __fastcall TFrmMain::OnWMSysCommand(TMessage &Msg)
{
if(Msg.WParam == SC_CONTEXTHELP)
{
// 在此处弹出你的帮助窗体
}
TForm::Dispatch(&Msg);
}
这种方法不能直接return吧
嗯,好贴要留名!· 哈哈
下面正好要用这个,学习啦
嗯,学习了
3 May
急!!我想在TTreeView中显示出所有硬盘中的目录树,其用TTreeView1->items->addchild()一个一个加的时候老是要去一个文件夹的绝对名字,然后再判断是否其有子文件夹。这样我所的到的是一个没有办法实现的过程判断(无终止的判断)!
望各位前辈多多指教,给出实现的框架!
实现后我要是在TTreeView中点击一个文件后能够方便的显示其绝对路径!谢谢大家了!!!!!!
遍历实现参数用TTreeNode来传递可以实现
<
<
<
3 Apr
大家好:
请教一下,怎样在文本框里显示图片啊?就象QQ聊天的那个界面那样
用richedit可以插入图片,不过要2.0版的bcb是1.0版的。
兄弟能不能提供下载啊?
网上好象搜不到。。。。。。。
RichEdit,BCB6是1.0,cb2007.2009应该不是1.0吧,不过没用过
那我应该怎样去判定它的版本啊?我用的是BCB 2007。
我倒是有Delphi的例子,但太长了,我没写写测试过。
手上有一个RichEdit3不过是Delphi的
怎样才能装到BCB2007上用啊?
经查BCB2007用的还是1.0的
手上有3.0 For Delphi 的,和知道怎样才能装到BCB上用?
或者大家能不能发我个For BCB的?
经查BCB2007用的还是1.0的
手上有3.0 For Delphi 的,和知道怎样才能装到BCB上用?
或者大家能不能发我个For BCB的?
HDC DC=GetDC(this->RichEdit1->Handle);
BitBlt(DC,0,0,this->Image1->Width,this->Image1->Height,this->Image1->Picture->Bitmap->Canvas->Handle,0,0,SRCCOPY);
好象不行吧?要RichEdit2.0以上才可以?
另外,添头文件
#include "richedit.h"
#include "ole2.h"
#include "richole.h"
使用ole实现,但是不能显示jpeg,即使加上了include <jpeg.hpp> using namespace std也不能
另外,如果双击插入的图片,会调用paint打开.
dsssssssssssssssssssssss
16 Mar
先举个例子,数据库中的表是这样的(MSSQL2000)
括号中为字段类型
idx img
(int) (image)
1 二进制
2 二进制
3 二进制
4 二进制
5 二进制
6 二进制
7 二进制
我现在想在QReport中,第一行显示序号为1 2 3的三张图片,第二行显示4 5 6的,第三行显示7的,
请问应该怎么做到,也就是说,每一行,显示数据库中的三条记录,有办法么?
多谢
不过还有没有其他办法啊?最好是直接能在QReport上做手脚的方法,写点代码也无所谓
还有个地方,就是QReport->Page->Column可以设置为3
但是这样设置以后,数据是纵向显示的,怎么能让它横向显示?
不会,帮顶