up

解决方案 »

  1.   

    TEdit和TDataTimePicker都是从TWinControl派生下来的。Edit的而3D属性是从TWinControl下面的TCustomEdit才有的属性。TDataTimePicker的祖先类TCommonCalendar没有这个属性。想直接设置它的3D属性,是办不到的。
                          TWinControl
                    ___________|______________
                    |                        |
               TCustomEdit(3D属性)       TCommonCalendar(没有3D属性)            
                    |                        |
                   Edit                  TCommonCalendar     
    提供两种解决办法:
    1:这种办法比较简单,容易实现。
    就是在界面上放一个Edit或者ComboBox将它的Ctl3D改为false。然后放一个MonthCalendar,设置Visible为false,当ComboBox 相应OnClick事件时MonthCaloendar的Visible := True; ComboBox.Text =  DateToStr(MonthCalendar1.Date);
    等等....你自己琢磨吧。
    2:写一个控件自己直接从TWinControl继承下来,写它的3D属性。这个比较复杂,相对比较难。可以先参考有关资料。
      

  2.   

    发现好多人问这个,我看了一下,发现edit的3d效果是delphi画出来的,所以比较方便的改成非3d的,可是日期控件是windows的"SysDateTimePick32"窗口类生成的默认就是3d的,好像是改不了。不过我在wm_paint的消息中把3d的颜色覆盖掉了,效果还可以,就是那个按钮没有作成3d的,自己该吧。
    1. 找到 TDateTimePicker 的源代码,增加wm_paint的消息处理函数。   procedure wmpaint(var message: tmessage); message wm_paint;procedure TDateTimePicker.wmpaint(var message: tmessage);
    var
      dc: hdc;
      Rec: TRect;
      BtnFaceBrush, WindowBrush: HBRUSH;
    begin
      inherited;
      BtnFaceBrush := CreateSolidBrush(ColorToRGB(clwhite));
      WindowBrush := CreateSolidBrush(ColorToRGB(clBlack));
      Rec.TopLeft := ClientToScreen(ClientRect.TopLeft);
      Rec.BottomRight := ClientToScreen(ClientRect.BottomRight);
      dc := getdc(0);
      InflateRect(Rec, 1, 1);
      FrameRect(dc, Rec, BtnFaceBrush);
      InflateRect(Rec, 1, 1);
      FrameRect(dc, Rec, WindowBrush);
      releasedc(0, dc);
      DeleteObject(WindowBrush);
      DeleteObject(BtnFaceBrush);
    end;重新编译一下可以看看效果。