我爱builder

C++Builder 程序员博客

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事件里写上那段代码看看。

  • Filed under: C++ Builder
  • 我想在软件运行前,显示一张图片,图片显示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控件,解决了问题,谢谢!

  • Filed under: C++ Builder
  • 设置dbedit,让dbedit不用输入数据而是显示程序中的某一运算结果a并将a的值保存到数据库中 怎么没人帮忙啊直接用普通的EDIT就可以了吧,你计算完了以后,直接设置它的TEXT,然后insert到数据库里就OK喽DbEdit->ReadOnly = true;设置为只读,或者使用dbText,只作为显示Dbedit现在可以显示某一运算结果但是为什么保存不到数据库呢,数据库中对应的字段数据值都是0<
    用了,dbedit的readonly设置了ture还是存不进数据库去,数据库中对应字段都是0

  • Filed under: C++ Builder
  • 下面的代码我想大家都见过 是读取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);
    }

  • Filed under: C++ Builder
  • 我把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吧嗯,好贴要留名!· 哈哈
    下面正好要用这个,学习啦嗯,学习了

  • Filed under: C++ Builder
  • 我把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吧嗯,好贴要留名!· 哈哈
    下面正好要用这个,学习啦嗯,学习了

  • Filed under: C++ Builder
  • 我把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吧嗯,好贴要留名!· 哈哈
    下面正好要用这个,学习啦嗯,学习了

  • Filed under: C++ Builder
  • 急!!我想在TTreeView中显示出所有硬盘中的目录树,其用TTreeView1->items->addchild()一个一个加的时候老是要去一个文件夹的绝对名字,然后再判断是否其有子文件夹。这样我所的到的是一个没有办法实现的过程判断(无终止的判断)!
    望各位前辈多多指教,给出实现的框架!
    实现后我要是在TTreeView中点击一个文件后能够方便的显示其绝对路径!谢谢大家了!!!!!!

    遍历实现参数用TTreeNode来传递可以实现<
    <
    <

  • Filed under: C++ Builder
  • 大家好:
    请教一下,怎样在文本框里显示图片啊?就象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

  • Filed under: C++ Builder
  • 先举个例子,数据库中的表是这样的(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

    但是这样设置以后,数据是纵向显示的,怎么能让它横向显示?不会,帮顶

  • Filed under: C++ Builder
  • 类别

    最新

    标签

    链接


    存档