不知不覺在新公司一個半月了。
感覺還不錯,剛剛接手項目兩天,還沒有什麼壓力。
軟件都是用D5開發的,沒有Object Treeview真是不適應。
公司的老人都挺能忍的。研發部的經理早說可以升級D7,
只有新人(就兩個)升級了,其他竟然還真的就在D5下面維護。都是老油條了。
D5升級到D7基本無痛。只是線程要注意點
D5結束線程用的是suspend之後free;
D7 我自己是用Freeonterminate:=true;Terminate;的。
不過同事說這個好像不穩定
推薦使用
Terminate;
Waitfor;
Free;
發現Delphi真是冷清啊。這周沒事在研究xe7下面doubulebuffer打開後panel不再透明的問題
最終在TwinControl中找到這個。
procedure TWinControl.WMPaint(var Message: TWMPaint);
還有下面這個
procedure TWinControl.WMEraseBkgnd(var Message: TWMEraseBkgnd); begin if StyleServices.Enabled and Assigned(Parent) and (csParentBackground in FControlStyle) then begin { Get the parent to draw its background into the control's background. } if Parent.DoubleBuffered then begin PerformEraseBackground(Self, Message.DC); end else begin StyleServices.DrawParentBackground(Handle, Message.DC, nil, False); end; end else begin { Only erase background if we're not doublebuffering or painting to memory. } if not FDoubleBuffered or {$IF DEFINED(CLR)} (Message.OriginalMessage.WParam = Message.OriginalMessage.LParam) then {$ELSE} (TMessage(Message).wParam = WPARAM(TMessage(Message).lParam)) then {$ENDIF} FillRect(Message.DC, ClientRect, FBrush.Handle); end; Message.Result := 1; end;
在wm_paint中啟作用的是下面的代碼(注釋掉的是我自己亂添加的)
想著如果在MemDC中直接把透明的部分給畫進去應該也算透明了,嘗試失敗。有大神看會的指點下。
DC := BeginPaint(Handle, PS); // if (csParentBackground in ControlStyle) and (self.Parent<>nil) then // begin // DC1:= GetDC(self.Parent.Handle); // PaintBuffer1 := BeginBufferedPaint(DC1,Rect(self.Left,self.Top,self.Left+self.Width,self.Top+self.Height), BPBF_COMPOSITED, nil, MemDC1); // Perform(WM_PRINTCLIENT, MemDC1, PRF_CLIENT); // EndBufferedPaint(PaintBuffer1, True); // end; Try //把控件在,內存中繪制 PaintBuffer := BeginBufferedPaint(DC, PS.rcPaint, BPBF_COMPOSITED, nil, MemDC); if PaintBuffer <> 0 then try // Perform(WM_PRINTCLIENT, MemDC1, 0); // if MemDC1<>0 then // begin // Perform(WM_ERASEBKGND, MemDC1, 0) // end // else begin Perform(WM_ERASEBKGND, MemDC, 0) end; Perform(WM_PRINTCLIENT, MemDC, PRF_CLIENT); if not (csPaintBlackOpaqueOnGlass in FControlStyle) then BufferedPaintMakeOpaque(PaintBuffer, PS.rcPaint); finally EndBufferedPaint(PaintBuffer, True); end; finally EndPaint(Handle, PS); end;
真是沒辦法了就只好放棄了。
大不了費點勁用FireMonkey來做顯示窗口,反正跟VCL混合編程好像也沒什麼問題。