unit wcontrol; {Une unité écrite par denis bertin pour denis-draw son logiciel le 13.2.2013} {Pour obtenir un centre de controle du dessin dans laquelle soit affiché des états dépendant de la sélectin} {En une après midi - reste à écrire le cas d'une multi-sélection} {Et encore il faut ajuster la règle vertical en fonction, c'est fait} {Et ajouter dans le menu des réglages le centre de contrôle-Denis Bertin Stéphane} {Il fallait encore ajouter le survolle de la souris pour afficher sa couleur bien exprimée dans son cas!} {Et aussi les miniatures de la sélection sous forme de vignettes séquentielles,... le 14.2.2013--C'Denis} interface uses wbase,u_object,windows,messages,graphics,classes; Type TRectControle = class(u_object.node) public son_Rectangle:trect; libeler:string; commentaire:string; epaisseur_du_filet:integer; visible:boolean; constructor Create(left,top,right,bottom:integer; un_libeler,un_commentaire:string; une_epaisseur_du_filet:integer); procedure paint(adc:hdc); virtual; function clic(apoint:tpoint; right:boolean):boolean; virtual; function situer(apoint:tpoint):boolean; virtual; end; TFilenameControle = class(TRectControle) procedure paint(adc:hdc); override; {recouvrement en Français} procedure Paint_decalage(adc:hdc; decalage:integer); procedure Paint_hilite(adc:hdc; decalage:integer); procedure get_max_with(var maximum:integer); end; TSizeControle= class(TRectControle) procedure paint(adc:hdc); override; function clic(apoint:tpoint; right:boolean):boolean; override; end; Tcommande= class(TRectControle) constructor Create(left,top,right,bottom:integer;un_libeler:string; commande:integer); procedure paint(adc:hdc); override; function clic(apoint:tpoint; right:boolean):boolean; override; private une_commande:integer; end; Tcommande_bleu= class(Tcommande) procedure paint(adc:hdc); override; end; TCloseControle = class(TRectControle) constructor Create(left,top:integer); procedure paint(adc:hdc); override; function clic(apoint:tpoint; right:boolean):boolean; override; function situer(apoint:tpoint):boolean; override; end; //Pour afficher les controle sur la sélection. TColorControle = class(TCloseControle) procedure paint(adc:hdc); override; function clic(apoint:tpoint; right:boolean):boolean; override; function situer(apoint:tpoint):boolean; override; end; TRainbowControle = class(TRectControle) constructor Create(left,top,right,bottom:integer); procedure paint(adc:hdc); override; function clic(apoint:tpoint; right:boolean):boolean; override; function situer(apoint:tpoint):boolean; override; end; THelpButtonControle = class(TRectControle) constructor Create(left,top,right,bottom:integer); procedure paint(adc:hdc); override; function clic(apoint:tpoint; right:boolean):boolean; override; function situer(apoint:tpoint):boolean; override; end; TBitmapControle = class(TRectControle) constructor Create(left,top,id,cmd:integer; un_msg:string; const droit:integer=0); procedure paint(adc:hdc); override; function clic(apoint:tpoint; right:boolean):boolean; override; function situer(apoint:tpoint):boolean; override; private son_id,sa_cmd,son_droit:integer; son_message:string; end; TReveiveControle = class(TBitmapControle) function clic(apoint:tpoint; right:boolean):boolean; override; end; TDrawControle = class(TRectControle) Constructor Create(left,top,Index:integer; Bitmap:graphics.tbitmap); procedure Paint(adc:hdc); override; function Clic(apoint:tpoint; right:boolean):boolean; override; destructor Destroy; override; private un_bitmap:graphics.tbitmap; un_index:integer; end; Tedit_filename = class(TRectControle) Constructor Create(left,top,right,bottom:integer); procedure Paint(adc:hdc); override; procedure timer; public filename:string; bool_cursor:boolean; end; TOpenAfile = class(wbase.Twindow) constructor Create(un_parent:wbase.TWinbase); destructor Destroy; override; procedure Setupwindow; override; function GetClassName: PChar; override; function Getstyle:DWORD; override; procedure Paint(PaintDC: HDC; var PaintInfo: TPaintStruct); override; procedure WMMouseMove(var Msg: TMessage); override; procedure WMLButtonDown(var Msg: TMessage); override; procedure WMVSCROLL(var msg:TMessage); override; procedure WMMOUSEWHEEL(var msg:TMessage); override; private list_fichier:metalist; end; TWindowControle = class(wbase.Twindow) constructor Create(un_parent:wbase.TWinbase); destructor Destroy; override; function GetClassName: PChar; override; function Getstyle:DWORD; override; procedure Actualiser; procedure Paint(PaintDC: HDC; var PaintInfo: TPaintStruct); override; procedure Paint_palette_neochrome(PaintDC:Hdc); procedure WMLButtonDown(var Msg: TMessage); override; procedure WMRButtonDown(var Msg: TMessage); override; procedure WMMouseMove(var Msg: TMessage); override; procedure WMCommand(var Msg: TMessage); override; procedure WMCHAR(var msg:TMessage); override; procedure WMKeyDown(var msg:TMessage); override; procedure WMTimer(var msg:TMessage); override; procedure WMVSCROLL(var Msg: TMessage); override; procedure Get_Name_of_path(pc_name_of_complet_path:pchar); procedure Open_A_File_name(Filename:pchar); public visibility:boolean; Show_les_controle:boolean; liste_rectangle:u_object.metalist; bool_aucune_element_de_selectionner:boolean; bool_forcer_l_affichage_des_couleur:boolean; bool_afficher_l_ecran_de_sauvegarde:boolean; end; implementation uses col_plan,wmain,hls_rvb,wutil,wformes1,wformebm,sysutils,relation,my_math,gdipobj, font_ob1,utile,unit_menu,wmenuk,uregedit,z_open_file,drawsym,g_base,math,haide, wregles,GDIPAPI,Registry,k_erreur,wproche,wformes2; {écrit par bertin} const id_valider_la_saisie = 1000; id_invalider_la_saisie = 1010; const k_hauteur_libeler = 24; constructor TRectControle.Create(left,top,right,bottom:integer; un_libeler,un_commentaire:string; une_epaisseur_du_filet:integer); begin setrect(self.son_Rectangle,left,top,right,bottom); self.libeler:=un_libeler; self.commentaire:=un_commentaire; self.epaisseur_du_filet:=une_epaisseur_du_filet; self.visible:=True; end; constructor Tcommande.Create(left,top,right,bottom:integer;un_libeler:string; commande:integer); begin inherited Create(left,top,right,bottom,un_libeler,'',0); self.une_commande:=commande; end; procedure TRectControle.paint(adc:hdc); var afont:hfont; begin afont:=selectObject(adc,wutil.Get_MakeDefaultFont(16)); SetBkMode(adc,Transparent); if (wmain.Wincontrole.bool_forcer_l_affichage_des_couleur or wmain.Wincontrole.bool_aucune_element_de_selectionner) and (self.son_Rectangle.top=2) then settextcolor(adc,g_base.rgb_blanc) else if wmain.Wincontrole.bool_afficher_l_ecran_de_sauvegarde then settextcolor(adc,g_base.rgb_blanc) else settextcolor(adc,g_base.rgb_bleu); with self.son_Rectangle do textout(adc,left,top,pchar(self.libeler),strlen(pchar(self.libeler))); deleteobject(SelectObject(adc,afont)); end; procedure TFilenameControle.paint(adc:hdc); var afont:hfont; begin settextcolor(adc,g_base.rgb_blanc); SetBkMode(adc,Transparent); afont:=selectObject(adc,wutil.Get_MakeDefaultFont(k_hauteur_libeler)); with self.son_Rectangle do textout(adc,left,top,pchar(self.libeler),strlen(pchar(self.libeler))); deleteobject(SelectObject(adc,afont)); end; procedure TFilenameControle.Paint_decalage(adc:hdc; decalage:integer); var afont:hfont; begin settextcolor(adc,g_base.rgb_Blanc); SetBkColor(adc,g_base.RGB_Bleu); SetBkMode(adc,Opaque); afont:=selectObject(adc,wutil.Get_MakeDefaultFont(k_hauteur_libeler)); with self.son_Rectangle do textout(adc,left,top-decalage*k_hauteur_libeler,pchar(self.libeler),strlen(pchar(self.libeler))); deleteobject(SelectObject(adc,afont)); end; {TFilenameControle.Paint_decalage} procedure TFilenameControle.Paint_hilite(adc:hdc; decalage:integer); var afont:hfont; un_rect:trect; deux_rect:trect; begin getclientrect(wmain.Wincontrole.hwindow,deux_rect); un_rect:=self.son_Rectangle; dec(un_rect.top,decalage*k_hauteur_libeler); un_rect.Left:=2; un_rect.Right:=deux_rect.Right; un_rect.Bottom:=un_rect.top+k_hauteur_libeler+6; wutil.Soft_rectangle_rectangulaire(adc,un_rect,g_base.rgb_bleu); settextcolor(adc,g_base.rgb_jaune); SetBkMode(adc,Transparent); afont:=selectObject(adc,wutil.Get_MakeDefaultFont(k_hauteur_libeler)); with self.son_Rectangle do textout(adc,left,top-decalage*k_hauteur_libeler,pchar(self.libeler),strlen(pchar(self.libeler))); deleteobject(SelectObject(adc,afont)); end; procedure TFilenameControle.get_max_with(var maximum:integer); var afont:hfont; size:tsize; adc:hdc; begin adc:=getdc(wmain.Wincontrole.hwindow); afont:=selectObject(adc,wutil.Get_MakeDefaultFont(k_hauteur_libeler)); GetTextExtentPoint(adc,pchar(self.libeler),strlen(pchar(self.libeler)),size); deleteobject(SelectObject(adc,afont)); maximum:=math.Max(maximum,size.cx); releasedc(wmain.Wincontrole.hwindow,adc); end; procedure TSizeControle.paint(adc:hdc); var afont:hfont; size:tsize; begin afont:=selectObject(adc,wutil.Get_MakeDefaultFont(16)); GetTextExtentPoint(adc,pchar(self.libeler),strlen(pchar(self.libeler)),size); with self.son_Rectangle do begin rectangle(adc,left-2,top-2,left+size.cx+2,top+size.cy+1); setbkmode(adc,Transparent); //En effet quand la première ligne était blanche ces caractères. settextcolor(adc,g_base.RGB_Noir); textout(adc,left,top,pchar(self.libeler),strlen(pchar(self.libeler))); end; deleteobject(SelectObject(adc,afont)); end; function TSizeControle.clic(apoint:tpoint; right:boolean):boolean; var un_calque_actif:col_plan.TCalque; l_element:wformes1.tforme_dessin; local_real_epaisseur:real; begin result:=false; if ptinrect(self.son_Rectangle,apoint) then begin result:=true; un_calque_actif:=wmain.MainWindow.wmsg.col_dessin.Get_calque_actif; if un_Calque_actif<>nil then begin l_element:=wformes1.tforme_dessin(un_Calque_actif.last_selection); if (l_element<>nil) and (l_element.ClassType=wformes1.tforme_dessin) then begin local_real_epaisseur:=strtofloat(self.libeler); local_real_epaisseur:=relation._10mm_to_log_pouce(local_real_epaisseur*10); l_element.epaisseur:=round(local_real_epaisseur); l_element.epaisseur_went:=l_element.epaisseur; l_element.calcul; postmessage(wmain.MainWindow.hwindow,wm_selection_changer,0,0); invalidaterect(wmain.MainWindow.hwindow,nil,false); end; end; end; end; {TSizeControle.clic} procedure Tcommande_bleu.paint(adc:hdc); var afont:hfont; size:tsize; begin afont:=selectObject(adc,wutil.Get_MakeDefaultFont(16)); GetTextExtentPoint(adc,pchar(self.libeler),strlen(pchar(self.libeler)),size); with self.son_Rectangle do begin rectangle(adc,left-2,top-2,left+size.cx+2,top+size.cy+1); self.son_Rectangle.Right:=left+size.cx+2; self.son_Rectangle.bottom:=top+size.cy+1; settextColor(adc,g_base.rgb_bleu); setbkmode(adc,Transparent); textout(adc,left,top,pchar(self.libeler),strlen(pchar(self.libeler))); end; deleteobject(SelectObject(adc,afont)); end; procedure Tcommande.paint(adc:hdc); var afont:hfont; size:tsize; begin afont:=selectObject(adc,wutil.Get_MakeDefaultFont(16)); GetTextExtentPoint(adc,pchar(self.libeler),strlen(pchar(self.libeler)),size); with self.son_Rectangle do begin rectangle(adc,left-2,top-2,left+size.cx+2,top+size.cy+1); self.son_Rectangle.Right:=left+size.cx+2; self.son_Rectangle.bottom:=top+size.cy+1; setbkmode(adc,Transparent); textout(adc,left,top,pchar(self.libeler),strlen(pchar(self.libeler))); end; deleteobject(SelectObject(adc,afont)); end; {Tcommande.paint} function Tcommande.clic(apoint:tpoint; right:boolean):boolean; begin result:=false; if ptinrect(self.son_Rectangle,apoint) then begin postmessage(wmain.MainWindow.hwindow,wm_command,self.une_commande,0); result:=true; end; end; function TRectControle.clic(apoint:tpoint; right:boolean):boolean; begin result:=false; end; function TRectControle.situer(apoint:tpoint):boolean; begin result:=false; end; constructor TCloseControle.Create(left,top:integer); begin inherited Create(left,top,left+16,top+16,'','',0); end; procedure TCloseControle.paint(adc:hdc); begin with self.son_Rectangle do drawsym.draw_radio_on(adc,left,top); end; function TCloseControle.clic(apoint:tpoint; right:boolean):boolean; begin result:=false; if ptinrect(self.son_Rectangle,apoint) then begin result:=true; postmessage(wmain.MainWindow.hwindow,wm_command,unit_menu.id_menu_afficher_le_centre_de_controle,0); end; end; function TCloseControle.situer(apoint:tpoint):boolean; begin result:=false; if ptinrect(self.son_Rectangle,apoint) then begin result:=true; wmain.Status_window.Show_a_message_court(z_open_file.string_fermer_cette_fenetre); end; end; procedure TColorControle.paint(adc:hdc); begin with self.son_Rectangle do drawsym.draw_radioff(adc,left,top); end; function TColorControle.clic(apoint:tpoint; right:boolean):boolean; begin result:=false; if ptinrect(self.son_Rectangle,apoint) then begin result:=true; if wmain.Wincontrole<>nil then begin wmain.Wincontrole.Show_les_controle:=true; wmain.Wincontrole.bool_forcer_l_affichage_des_couleur:= not wmain.Wincontrole.bool_forcer_l_affichage_des_couleur; Wincontrole.Actualiser; invalidaterect(wmain.Wincontrole.hwindow,nil,true); end; end; end; function TColorControle.Situer(apoint:tpoint):boolean; begin result:=false; if ptinrect(self.son_Rectangle,apoint) then begin result:=true; if wmain.Status_window<>nil then wmain.Status_window.Show_a_message_court(z_open_file.string_afficher_la_palette); end; end; constructor TBitmapControle.Create(left,top,id,cmd:integer; un_msg:string; const droit:integer=0); begin inherited Create(left,top,left+40,top+40,'','',0); self.son_id:=id; self.sa_cmd:=cmd; self.son_droit:=droit; self.son_message:=un_msg; end; procedure TBitmapControle.paint(adc:hdc); var abitmap:hbitmap; memdc:hdc; begin if self.visible then begin abitmap:=loadbitmap(hinstance,pchar(son_id)); memdc:=createcompatibledc(adc); selectobject(memdc,abitmap); with self.son_Rectangle do bitblt(adc,left,top,40,40,memdc,0,0,SRCCOPY); deleteDC(memdc); DeleteObject(abitmap); end; end; {TBitmapControle.paint} function TBitmapControle.clic(apoint:tpoint; right:boolean):boolean; begin result:=false; if ptinrect(self.son_Rectangle,apoint) then begin if wmain.MainWindow<>nil then begin result:=true; if right then begin if self.son_droit<>0 then postmessage(wmain.MainWindow.hwindow,wm_command,self.son_droit,0); end else postmessage(wmain.MainWindow.hwindow,wm_command,self.sa_cmd,0); end; end; end; function TReveiveControle.clic(apoint:tpoint; right:boolean):boolean; begin result:=false; if ptinrect(self.son_Rectangle,apoint) then begin result:=true; if wmain.MainWindow<>nil then if right then postmessage(wmain.Wincontrole.hwindow,wm_command,self.sa_cmd,1) else postmessage(wmain.Wincontrole.hwindow,wm_command,self.sa_cmd,0); end; end; function TBitmapControle.situer(apoint:tpoint):boolean; begin result:=false; if ptinrect(self.son_Rectangle,apoint) then begin result:=true; if wmain.Status_window<>nil then wmain.Status_window.Show_a_message_court(self.son_message); end; end; {*****************************************************************************} Constructor TDrawControle.Create(left,top,Index:integer; Bitmap:graphics.tbitmap); Begin inherited Create(left,top,left+40,top+40,'','',0); self.un_index:=Index; self.un_bitmap:=Bitmap; end; procedure TDrawControle.Paint(adc:hdc); var memdc:hdc; apc:wutil.pc100; old_bitmap:hbitmap; begin if self.un_bitmap<>nil then begin memdc:=createcompatibledc(adc); old_bitmap:=selectobject(memdc,self.un_bitmap.Handle); with self.son_Rectangle do bitblt(adc,left,top,40,40,memdc,0,0,SRCCOPY); selectobject(memdc,old_bitmap); deleteDC(memdc); end else begin with self.son_Rectangle do begin rectangle(adc,left,top,right,bottom); inttopchar(self.un_index,apc); textout(adc,left,top,apc,strlen(apc)); end; end; end; {TDrawControle.Paint} function TDrawControle.Clic(apoint:tpoint; right:boolean):boolean; begin result:=false; if ptinrect(self.son_Rectangle,apoint) then begin result:=True; if wmain.MainWindow<>nil then wmain.MainWindow.Afficher_l_index_selectionner(self.un_index); end; end; {TDrawControle.Clic} destructor TDrawControle.Destroy; begin if self.un_bitmap<>nil then self.un_bitmap.free; inherited Destroy; end; {*****************************************************************************} Constructor Tedit_filename.Create(left,top,right,bottom:integer); begin inherited Create(left,top,right,bottom,'','',0); self.filename:=''; self.bool_cursor:=false; end; procedure Tedit_filename.Paint(adc:hdc); var apen:hpen; afont:hfont; begin apen:=selectObject(adc,Createpen(ps_solid,2,g_base.RGB_Blanc)); with self.son_Rectangle do rectangle(adc,left,top,right,bottom); deleteobject(selectObject(adc,apen)); afont:=SelectObject(adc,wutil.Get_MakeDefaultFont(k_hauteur_libeler)); with self.son_Rectangle do textout(adc,left+4,top+4,pchar(filename),length(filename)); deleteobject(SelectObject(adc,afont)); end; {Tedit_filename.Paint} procedure Tedit_filename.timer; var adc:hdc; size:tsize; afont:hfont; abrush:hbrush; begin adc:=getdc(wmain.Wincontrole.hwindow); afont:=SelectObject(adc,wutil.Get_MakeDefaultFont(k_hauteur_libeler)); if self.bool_cursor then abrush:=SelectObject(adc,Createsolidbrush(g_base.RGB_Blanc)) else abrush:=SelectObject(adc,Createsolidbrush(g_base.RGB_BLeu)); if length(filename)=0 then begin GetTextExtentPoint(adc,'A',1,size); size.cx:=0; end else begin GetTextExtentPoint(adc,pchar(filename),length(filename),size); end; with self.son_Rectangle do rectangle(adc,left+4+size.cx,top+4+size.cy,left+4+size.cx+12,top+4+size.cy-4); deleteobject(SelectObject(adc,afont)); releasedc(wmain.Wincontrole.hwindow,adc); self.bool_cursor:=not self.bool_cursor; end; {*****************************************************************************} function methode_comparaison(Item1, Item2: Pointer):integer; begin result:=strcomp(pchar(TFilenameControle(Item1).libeler), pchar(TFilenameControle(Item2).libeler)); end; Constructor TOpenAfile.Create(un_parent:wbase.TWinbase); var pc_nom_du_repertoire_user:pc1024; sr: SysUtils.TSearchRec; FileAttrs:Integer; i:integer; pc_filename_found:pc1024; p:pchar; collection_a_trier:u_object.TO_COL; un_FilenameControle:TFilenameControle; begin list_fichier:=metalist.create; collection_a_trier:=u_object.TO_COL.Create; FileAttrs:=faAnyFile; //Recherche des fichiers correspondants TWindowControle(Parent).Get_Name_of_path(pc_nom_du_repertoire_user); i:=0; if SysUtils.findfirst(strpas(pc_nom_du_repertoire_user)+'\'+wmenuk.chaine_etoile_ato,FileAttrs,sr) = 0 then begin repeat if sr.Name[1]<>'.' then begin strcopy(pc_filename_found,pchar(sr.Name)); p:=strpos(pc_filename_found,wmenuk.point_ato); if p<>nil then p^:=#0; collection_a_trier.Add(TFilenameControle.Create(4,i*k_hauteur_libeler,320,succ(i)*k_hauteur_libeler,pc_filename_found,'',0)); inc(i); end; until SysUtils.FindNext(sr)<>0; end; SysUtils.findClose(sr); if true then begin collection_a_trier.Sort(methode_comparaison); for i:=0 to pred(collection_a_trier.count) do begin un_FilenameControle:=TFilenameControle(collection_a_trier.at(i)); un_FilenameControle.son_Rectangle.top:=i*k_hauteur_libeler; un_FilenameControle.son_Rectangle.bottom:=succ(i)*k_hauteur_libeler; list_fichier.Add(un_FilenameControle); end; collection_a_trier.OwnsObjects:=false; collection_a_trier.Clear; collection_a_trier.free; inherited Create(un_parent,'Ouvrir un fichier',100,100,320,500,false,false,0); end; end; destructor TOpenAfile.Destroy; begin list_fichier.free; inherited Destroy; end; Procedure TOpenAfile.Setupwindow; var une_largeur:integer; une_hauteur:integer; aTFilenameControle:TFilenameControle; i,maximum:integer; ScrollInfo_vertical:TScrollInfo; begin inherited Setupwindow; if list_fichier.count=0 then begin k_erreur.MessageBox(self.hwindow,k_erreur.Tell_Aucun_dessin_na_ete_enregistrer_dans_ce_repertoire,mb_ok or mb_iconstop); postmessage(self.hwindow,wm_close,0,0); exit; end; //Trouver la largeur la plus importante maximum:=0; for i:=0 to pred(list_fichier.count) do begin aTFilenameControle:=TFilenameControle(list_fichier.at(i)); aTFilenameControle.get_max_with(maximum); end; une_largeur:=maximum+12; if list_fichier.count>20 then inc(une_largeur,getsystemmetrics(SM_CYHSCROLL)); une_hauteur:=k_hauteur_libeler*math.min(20,list_fichier.count)+ GetSystemMetrics(SM_CYCAPTION)+ GetSystemMetrics(SM_CYBORDER)+4; Movewindow(self.hwindow, (getsystemmetrics(SM_CXFULLSCREEN)-une_largeur) div 2, (getsystemmetrics(SM_CYFULLSCREEN)-une_hauteur) div 2, une_largeur,une_hauteur,false); if list_fichier.count>20 then begin ScrollInfo_vertical.cbSize:=sizeof(TScrollInfo); ScrollInfo_vertical.fMask:=SIF_ALL; ScrollInfo_vertical.nMin:=0; ScrollInfo_vertical.nMax:=list_fichier.count-20; ScrollInfo_vertical.nPage:=0; ScrollInfo_vertical.nPos:=0; ScrollInfo_vertical.nTrackPos:=0; SetScrollInfo(self.hwindow,SB_VERT,ScrollInfo_vertical,true); end; end; function TOpenAfile.GetClassName:PChar; begin GetClassName:='WinBirdOpenAfile'; //Bertin-draw end; function TOpenAfile.Getstyle:DWORD; begin if self.list_fichier.count<=20 then Getstyle:=ws_popup or ws_border or ws_caption or ws_sysmenu else Getstyle:=ws_popup or ws_border or ws_caption or ws_vscroll or ws_sysmenu; end; procedure TOpenAfile.Paint(PaintDC: HDC; var PaintInfo: TPaintStruct); var i:integer; arect:trect; abrush:hbrush; aTFilenameControle:TFilenameControle; begin getclientrect(self.hwindow,arect); abrush:=selectobject(PaintDC,CreatesolidBrush(g_base.rgb_bleu)); with arect do rectangle(PaintDC,pred(left),pred(top),succ(right),succ(bottom)); deleteobject(selectobject(PaintDC,abrush)); for i:=0 to pred(list_fichier.count) do begin aTFilenameControle:=TFilenameControle(list_fichier.at(i)); aTFilenameControle.Paint_decalage(PaintDC,GetScrollPos(self.hwindow,SB_VERT)); end; {for i} end; procedure TOpenAfile.WMMouseMove(var Msg: TMessage); var i:integer; adc,memdc:hdc; arect:trect; abrush:hbrush; point_souris:tpoint; old_bitmap:hbitmap; aTFilenameControle:TFilenameControle; begin getclientrect(hwindow,arect); point_souris.y:=Smallint(hiword(msg.lparam)); inc(point_souris.y,Getscrollpos(self.hwindow,SB_VERT)*k_hauteur_libeler); adc:=getdc(self.hwindow); memdc:=createcompatibledc(adc); with arect do old_bitmap:=selectobject(memdc,createcompatiblebitmap(adc,right,bottom)); abrush:=selectobject(memdc,CreatesolidBrush(g_base.rgb_bleu)); with arect do rectangle(memdc,pred(left),pred(top),succ(right),succ(bottom)); deleteobject(selectobject(memdc,abrush)); for i:=0 to pred(list_fichier.count) do begin aTFilenameControle:=TFilenameControle(list_fichier.at(i)); if (aTFilenameControle.son_Rectangle.top<=point_souris.y) and (aTFilenameControle.son_Rectangle.bottom>=point_souris.y) then aTFilenameControle.Paint_hilite(memdc,GetScrollPos(self.hwindow,SB_VERT)) else aTFilenameControle.Paint_decalage(memdc,GetScrollPos(self.hwindow,SB_VERT)); end; {for i} with arect do bitblt(adc,0,0,right,bottom,memdc,0,0,SRCCOPY); deleteobject(selectobject(memdc,old_bitmap)); deleteDC(memdc); releasedc(self.hwindow,adc); end; {TOpenAfile.WMMouseMove} procedure TOpenAfile.WMLButtonDown(var Msg: TMessage); var i:integer; point_souris:tpoint; aTFilenameControle:TFilenameControle; begin point_souris.y:=Smallint(hiword(msg.lparam)); inc(point_souris.y,Getscrollpos(self.hwindow,SB_VERT)*k_hauteur_libeler); for i:=0 to pred(list_fichier.count) do begin aTFilenameControle:=TFilenameControle(list_fichier.at(i)); if (aTFilenameControle.son_Rectangle.top<=point_souris.y) and (aTFilenameControle.son_Rectangle.bottom>=point_souris.y) then begin wmain.Wincontrole.Open_A_File_name(pchar(aTFilenameControle.libeler)); end; end; end; {TOpenAfile.WMLButtonDown} procedure TOpenAfile.WMVSCROLL(var msg:TMessage); var pos,nScrollCode:integer; begin nScrollCode:=LOWORD(msg.wParam); if (nScrollCode=SB_THUMBPOSITION) or (nScrollCode=SB_THUMBTRACK) then pos:=HIWORD(msg.wParam) else pos:=GetScrollPos(self.hwindow,SB_VERT); case nScrollCode of SB_BOTTOM: begin pos:=0; end; SB_ENDSCROLL: begin invalidaterect(self.hwindow,nil,false); exit; end; SB_LINELEFT: begin pos:=math.max(0,pos-1); end; SB_LINERIGHT: begin pos:=math.min(pos+1,self.list_fichier.count-20); end; SB_PAGELEFT: begin pos:=math.max(0,pos-10); end; SB_PAGERIGHT: begin pos:=math.min(pos+10,self.list_fichier.count-20); end; SB_THUMBPOSITION: begin end; SB_THUMBTRACK: begin invalidaterect(self.hwindow,nil,false); updatewindow(self.hwindow); end; SB_TOP:pos:=self.list_fichier.count-20; end; {case} SetScrollPos(Self.hwindow,SB_VERT,Pos,true); end; {TOpenAfile.WMVSCROLL} procedure TOpenAfile.WMMOUSEWHEEL(var msg:TMessage); var zDelta:integer; begin zDelta:=smallint((msg.wParam and $ffff0000) shr 16); // wheel rotation if zDelta>0 then postmessage(self.hwindow,wm_VSCROLL,makelong(SB_LINELEFT,0),0) else postmessage(self.hwindow,wm_VSCROLL,makelong(SB_LINERIGHT,0),0); invalidaterect(self.hwindow,nil,false); end; {TOpenAfile.WMMOUSEWHEEL} {*****************************************************************************} constructor TWindowControle.create(un_parent:wbase.TWinbase); begin inherited create(un_parent,'Centre de contrôle',100,100,320,100,false,false,0,false); //-1,-1,-1,-1 self.liste_rectangle:=u_object.metalist.create; self.Show_les_controle:=True; self.visibility:=uregedit.RegGetPrivateProfileInt(wmenuk.circle,z_open_file.string_afficher_le_centre_de_controle,1)=1; self.bool_forcer_l_affichage_des_couleur:=false; self.bool_afficher_l_ecran_de_sauvegarde:=false; settimer(self.hwindow,100,220,nil); end; destructor TWindowControle.destroy; begin self.liste_rectangle.free; inherited destroy; end; function TWindowControle.GetClassName:PChar; begin GetClassName:='Denisdraw_control_center'; end; function TWindowControle.Getstyle:DWORD; begin Getstyle:=ws_child or ws_visible or ws_border; end; procedure TWindowControle.actualiser; const point_groud_zero : tpoint = (x:0;y:0); var i,j:integer; l_element:wformes1.tforme_dessin; un_calque_actif:col_plan.TCalque; pc_commentaire,apc,pc_stroke_ligne:pc255; plot:font_ob1.testnode; rayon:real; pc_une_taille:pc100; arect:trect; une_dist:real; un_angle:real; un_index:u_object.tindex; position:tpoint; un_bitmap:Graphics.tbitmap; un_contexte_d_affichage:hdc; un_rectangle_global:trect; old_bitmap:hbitmap; memory_display_context:hdc; Zoom_coefficient:real; graphics:gdipobj.TGPGraphics; resultat:integer; begin if self.bool_afficher_l_ecran_de_sauvegarde then exit; if not self.Show_les_controle then exit; liste_rectangle.freeall; getclientrect(self.hwindow,arect); bool_aucune_element_de_selectionner:=true; un_calque_actif:=wmain.MainWindow.wmsg.col_dessin.Get_calque_actif; if un_Calque_actif<>nil then begin if un_Calque_actif.col_select.count=0 then begin liste_rectangle.Add(TReveiveControle.Create(20,6,104,unit_menu.id_menu_ouvrir, z_open_file.string_Ouvrir_un_fichier)); {écrit par denis bertin} liste_rectangle.Add(TRectControle.Create(22,45,90,110,'Ouvrir','',0)); liste_rectangle.Add(TReveiveControle.Create(70,6,102,unit_menu.id_menu_file_save_as, z_open_file.string_enregistrer_le_fichier)); {écrit par denis bertin} liste_rectangle.Add(TRectControle.Create(72,45,120,110,'Sauver','',0)); liste_rectangle.Add(TBitmapControle.Create(130,6,101,unit_menu.id_menu_afficher_la_grille_de_repere, z_open_file.string_afficher_la_palette,unit_menu.id_menu_option_la_grille_de_repere)); liste_rectangle.Add(TRectControle.Create(132,45,120,110,'Grille','',0)); liste_rectangle.Add(TReveiveControle.Create(180,6,107,unit_menu.id_menu_imprimer, z_open_file.string_Imprimer_un_fichier)); {écrit par denis bertin} liste_rectangle.Add(TRectControle.Create(182,45,120,110,'Imprimer','',0)); end else if un_Calque_actif.col_select.count>1 then begin un_rectangle_global:=g_base.grand_plan; for i:=0 to pred(un_Calque_actif.count) do begin un_index:=u_object.tindex(un_Calque_actif.col_select.at(i)); if un_index<>nil then begin l_element:=wformes1.tforme_dessin(un_Calque_actif.formindex(un_index)); if l_element<>nil then begin position.x:=l_element.left; position.y:=l_element.top; with position do l_element.deplace(-x,-y,0); un_bitmap:=Tbitmap.Create; un_bitmap.Width:=40; un_bitmap.Height:=40; un_contexte_d_affichage:=getdc(self.hwindow); memory_display_context:=CreateCompatibleDc(un_contexte_d_affichage); old_bitmap:=selectobject(memory_display_context,un_bitmap.Handle); {$ifdef debug} moveto(memory_display_context,0,0); lineto(memory_display_context,40,40); {$endif debug} graphics:=gdipobj.TGPGraphics.Create(memory_display_context); graphics.SetSmoothingMode(GDIPAPI.SmoothingModeAntiAlias); //Détermination du coefficient de zoom - impect.bertin Zoom_coefficient:=1.08*(1/my_math.REAL_min(40*1/l_element.la_largeur,40*1/l_element.la_hauteur)); l_element.draw(memory_display_context,graphics,un_rectangle_global,Zoom_coefficient,false,g_base.rgb_bleu); graphics.free; selectobject(un_contexte_d_affichage,old_bitmap); deletedc(memory_display_context); releasedc(self.hwindow,un_contexte_d_affichage); with position do l_element.deplace(+x,+y,0); liste_rectangle.Add(TDrawControle.Create(10+i*50,10,pred(un_Calque_actif.count-i),un_bitmap)); {écrit par denis bertin aujourd'hui} end; end; end; end else if un_Calque_actif.col_select.count=1 then begin //Un seul élément est sélectionné. bool_aucune_element_de_selectionner:=false; l_element:=wformes1.tforme_dessin(un_Calque_actif.last_selection); if (l_element<>nil) and (l_element.ClassType=wformes2.tforme_groupe) then begin if wformes2.tforme_groupe(l_element).groupe.count=1 then liste_rectangle.Add(Tcommande.Create(6,44,200,48,' Un groupe de '+ inttostr(wformes2.tforme_groupe(l_element).groupe.count)+' élément est sélectionné ',unit_menu.id_editer_un_bitmap)) else liste_rectangle.Add(Tcommande.Create(6,44,200,48,' Un groupe '+ inttostr(wformes2.tforme_groupe(l_element).groupe.count)+' éléments est sélectionné ',unit_menu.id_editer_un_bitmap)) end else if (l_element<>nil) and (l_element.ClassType=wformebm.Tforme_TBitMap) then begin self.bool_forcer_l_affichage_des_couleur:=true; invalidaterect(self.hwindow,nil,false); liste_rectangle.Add(Tcommande.Create(6,44,200,48,' Éditeur de pixels ',unit_menu.id_editer_un_bitmap)); end else if (l_element<>nil) and (l_element.ClassType=wformes1.tforme_text) then begin //Un seul élément de texte strcopy(pc_commentaire,'Une ligne de texte est sélectionnée,'); liste_rectangle.Add(TRectControle.Create(10,2,200,32,strpas(pc_commentaire),'',0)); strcopy(pc_commentaire,'Sa typographie est '); {écrit par bertin} strcat(pc_commentaire,pchar(wformes1.tforme_text(l_element).af.nom)); strcat(pc_commentaire,pchar(' son corps est de '+inttostr(wformes1.tforme_text(l_element).af.raf.taille)+' points')); liste_rectangle.Add(TRectControle.Create(10,18,200,32,strpas(pc_commentaire),'',0)); resultat:=getsystemmetrics(SM_CXSCREEN); if resultat>=1680 then begin for i:=1 to 20 do for j:=1 to 3 do begin strcopy(pc_une_taille,pchar(floattostr((i+pred(j)*20)/10))); {Denis BERTIN} if strlen(pc_une_taille)=1 then strcat(pc_une_taille,',0'); liste_rectangle.Add(TSizeControle.Create( 340+i*32,3+pred(j)*20,340+i*32+20,3+pred(j)*20+20,pc_une_taille,'',0)); {denis Bertin} end; end else begin for i:=1 to 10 do for j:=1 to 3 do begin strcopy(pc_une_taille,pchar(floattostr(((i+pred(j)*10)/10)))); if strlen(pc_une_taille)=1 then strcat(pc_une_taille,',0'); liste_rectangle.Add(TSizeControle.Create( 340+i*32,3+pred(j)*20,340+i*32+20,3+pred(j)*20+20,pc_une_taille,'',0)); {denis Bertin} end; end; liste_rectangle.Add(Tcommande.Create(10,40,200,48,' Voulez-vous l''éditer... ',unit_menu.id_popup_edit_single_ligne)); liste_rectangle.Add(Tcommande.Create(160,40,200,48,' Voulez-vous l''éclater ',unit_menu.id_popup_eclater_un_texte_en_element_separer)); if (Getsystemmetrics(SM_CXSCREEN)>=1680) then begin liste_rectangle.Add(Tcommande.Create(1020,4,200,48,' Caractèristiques... ',unit_menu.id_menu_attributs_texte)); liste_rectangle.Add(Tcommande.Create(1020,24,200,48,' Ajouter un blob... ',unit_menu.id_effet_Ajouter_des_bubble_blog)); end else if (Getsystemmetrics(SM_CXSCREEN)>=1280) then begin liste_rectangle.Add(Tcommande.Create(720,4,200,48,' Caractèristiques... ',unit_menu.id_menu_attributs_texte)); liste_rectangle.Add(Tcommande.Create(720,24,200,48,' Ajouter un blob... ',unit_menu.id_effet_Ajouter_des_bubble_blog)); end else if (Getsystemmetrics(SM_CXSCREEN)>=1024) then begin liste_rectangle.Add(Tcommande.Create(700,4,200,48,' Typo... ',unit_menu.id_menu_attributs_texte)); liste_rectangle.Add(Tcommande.Create(700,24,200,48,' Blob... ',unit_menu.id_effet_Ajouter_des_bubble_blog)); end; end //Un seul élément de texte else if (l_element<>nil) and (l_element.ClassType=wformes1.tforme_dessin) then begin //un élément de dessin if l_element.is_un_disque then begin strcopy(pc_commentaire,'Un disque est sélectionnée,'); real_to_pchar_format(relation.log_pouce_to_10mm_real(l_element.epaisseur)/10,pc_stroke_ligne,3,1); strcat(pc_commentaire,pchar(' épaisseur = '+strpas(pc_stroke_ligne)+' mm')); liste_rectangle.Add(TRectControle.Create(10,2,200,32,strpas(pc_commentaire),'',0)); plot:=font_ob1.testnode(l_element.elements.at(1)); if plot<>nil then begin strcopy(pc_commentaire,'Son rayon est de '); rayon:=relation.log_pouce_to_10mm_real(utile.distance(0,0,plot.x,plot.y))/10; real_to_pchar_format(rayon,pc_stroke_ligne,3,2); strcat(pc_commentaire,pchar(strpas(pc_stroke_ligne)+' mm')); liste_rectangle.Add(TRectControle.Create(10,18,200,32,strpas(pc_commentaire),'',0)); strcopy(pc_commentaire,'Sa surface est de '); rayon:=round(rayon*10)/10; real_to_pchar_format(rayon*rayon*Pi,pc_stroke_ligne,3,4); strcat(pc_commentaire,pchar(strpas(pc_stroke_ligne)+' mm²')); liste_rectangle.Add(TRectControle.Create(10,34,200,32,strpas(pc_commentaire),'',0)); end; if (Getsystemmetrics(SM_CXSCREEN)>=1680) then begin liste_rectangle.Add(Tcommande.Create(1020,4,200,48,' Caractèristiques... ',unit_menu.id_menu_attributs_dessin)); liste_rectangle.Add(Tcommande.Create(1020,24,200,48,' Ajouter un blob... ',unit_menu.id_effet_Ajouter_des_bubble_blog)); if l_element.fermable then begin liste_rectangle.Add(Tcommande.Create(1180,4,300,48,' Voulez-vous la colorier ',unit_menu.id_popup_fermer)); end else if l_element.ouvrable then begin liste_rectangle.Add(Tcommande.Create(1180,4,200,48,' Voulez-vous l''ouvrir ',unit_menu.id_popup_Ouvrir)); end; end end else if l_element.is_avec_des_splines then begin strcopy(pc_commentaire,'Une Courbe de Bézier est sélectionnée,'); real_to_pchar_format(relation.log_pouce_to_10mm_real(l_element.epaisseur)/10,pc_stroke_ligne,3,1); strcat(pc_commentaire,pchar(' épaisseur = '+strpas(pc_stroke_ligne)+' mm')); liste_rectangle.Add(TRectControle.Create(10,2,200,32,strpas(pc_commentaire),'',0)); inttopchar(l_element.elements.count,pc_stroke_ligne); strcat(strcat(strcopy(pc_commentaire,'Elle est constituée de '),pc_stroke_ligne), ' points'); liste_rectangle.Add(TRectControle.Create(10,18,200,32,strpas(pc_commentaire),'',0)); if l_element.fermable and (l_element.elements.count>2) then begin liste_rectangle.Add(Tcommande.Create(10,36,200,48,' Voulez-vous la colorier ',unit_menu.id_popup_fermer)); end else if l_element.ouvrable then begin liste_rectangle.Add(Tcommande.Create(10,36,200,48,' Voulez-vous l''ouvrir ',unit_menu.id_popup_Ouvrir)); end; liste_rectangle.Add(Tcommande.Create(160,36,200,48,' Afficher les couleurs ',unit_menu.id_menu_afficher_les_couleur_du_centre_de_controle)); if getsystemmetrics(SM_CXSCREEN)>=1680 then begin liste_rectangle.Add(Tcommande.Create(1020,4,200,56,' Afficher une nébuleuse ',unit_menu.id_popup_create_nebuloide_bitmap)); liste_rectangle.Add(Tcommande.Create(1020,24,200,56,' Afficher une rubalize ',unit_menu.id_effet_spline_dessiner_un_rubalize)); end; end else if l_element.is_avec_des_ovales then begin strcopy(pc_commentaire,'Un ellipse est sélectionnée,'); real_to_pchar_format(relation.log_pouce_to_10mm_real(l_element.epaisseur)/10,pc_stroke_ligne,3,1); strcat(pc_commentaire,pchar(' épaisseur = '+strpas(pc_stroke_ligne)+' mm')); liste_rectangle.Add(TRectControle.Create(10,2,200,32,strpas(pc_commentaire),'',0)); if l_element.fermable then begin liste_rectangle.Add(Tcommande_bleu.Create(10,24,200,48,' Voulez-vous la colorier ',unit_menu.id_popup_fermer)); end else if l_element.ouvrable then begin liste_rectangle.Add(Tcommande_bleu.Create(10,24,200,48,' Voulez-vous l''ouvrir ',unit_menu.id_popup_Ouvrir)); end; liste_rectangle.Add(Tcommande_bleu.Create(150,24,200,48,' Afficher les couleurs ',unit_menu.id_menu_afficher_les_couleur_du_centre_de_controle)); if (Getsystemmetrics(SM_CXSCREEN)>=1680) then begin liste_rectangle.Add(Tcommande.Create(1020,4,200,48,' Caractèristiques... ',unit_menu.id_menu_attributs_dessin)); liste_rectangle.Add(Tcommande.Create(1020,24,200,48,' Ajouter un blob... ',unit_menu.id_effet_Ajouter_des_bubble_blog)); end else if (Getsystemmetrics(SM_CXSCREEN)>=1280) then begin liste_rectangle.Add(Tcommande.Create(720,4,200,48,' Caractèristiques... ',unit_menu.id_menu_attributs_dessin)); liste_rectangle.Add(Tcommande.Create(720,24,200,48,' Ajouter un blob... ',unit_menu.id_effet_Ajouter_des_bubble_blog)); end else if (Getsystemmetrics(SM_CXSCREEN)>=1024) then begin liste_rectangle.Add(Tcommande.Create(700,4,200,48,' Typo... ',unit_menu.id_menu_attributs_dessin)); liste_rectangle.Add(Tcommande.Create(700,24,200,48,' Blob... ',unit_menu.id_effet_Ajouter_des_bubble_blog)); end; end else if l_element.is_un_cercle then begin strcopy(pc_commentaire,'Un cercle est sélectionnée,'); real_to_pchar_format(relation.log_pouce_to_10mm_real(l_element.epaisseur)/10,pc_stroke_ligne,3,1); strcat(pc_commentaire,pchar(' épaisseur = '+strpas(pc_stroke_ligne)+' mm')); liste_rectangle.Add(TRectControle.Create(10,2,200,32,strpas(pc_commentaire),'',0)); plot:=font_ob1.testnode(l_element.elements.at(1)); if plot<>nil then begin strcopy(pc_commentaire,'Son rayon est de '); rayon:=relation.log_pouce_to_10mm_real(utile.distance(0,0,plot.x,plot.y))/10; real_to_pchar_format(rayon,pc_stroke_ligne,3,2); strcat(pc_commentaire,pchar(strpas(pc_stroke_ligne)+' mm')); liste_rectangle.Add(TRectControle.Create(10,18,200,32,strpas(pc_commentaire),'',0)); strcopy(pc_commentaire,'Sa surface est de '); rayon:=round(rayon*10)/10; real_to_pchar_format(rayon*rayon*Pi,pc_stroke_ligne,3,4); strcat(pc_commentaire,pchar(strpas(pc_stroke_ligne)+' mm²')); liste_rectangle.Add(TRectControle.Create(10,34,200,32,strpas(pc_commentaire),'',0)); end; if l_element.fermable then begin liste_rectangle.Add(Tcommande.Create(220,22,300,48,' Voulez-vous la colorier ',unit_menu.id_popup_fermer)); end; if true then begin liste_rectangle.Add(Tcommande.Create(230,43,300,72,' Convertir en Bézier ',unit_menu.id_popup_convertir_en_bezier)); end; if (Getsystemmetrics(SM_CXSCREEN)>=1680) then begin liste_rectangle.Add(Tcommande.Create(1004,4,1200,12,' Ajouter le rayon ',unit_menu.id_effets_cercle_ajouter_le_rayon)); liste_rectangle.Add(Tcommande.Create(1004,22,1200,20,' Ajouter des quartiers ',unit_menu.id_effets_cercle_ajouter_des_quartiers)); liste_rectangle.Add(Tcommande.Create(1004,22+18,1200,30,' Tracer une moire ',unit_menu.id_effets_cercle_ajouter_tracer_une_moire)); liste_rectangle.Add(Tcommande.Create(1140,4,1200,12,' Tracer les axes ',unit_menu.id_menu_boite_magique_tracer_les_axes_du_cercle)); liste_rectangle.Add(Tcommande.Create(1140,22,1200,12,' Tracé Bézier ',unit_menu.id_popup_convertir_en_bezier)); end else if (Getsystemmetrics(SM_CXSCREEN)>=1280) then begin liste_rectangle.Add(Tcommande.Create(700,4,1200,12,' Tracer les axes ',unit_menu.id_menu_boite_magique_tracer_les_axes_du_cercle)); liste_rectangle.Add(Tcommande.Create(700,22,1200,20,' Ajouter des quartiers ',unit_menu.id_effets_cercle_ajouter_des_quartiers)); liste_rectangle.Add(Tcommande.Create(700,22+18,1200,30,' Tracer une moire ',unit_menu.id_effets_cercle_ajouter_tracer_une_moire)); end else if (Getsystemmetrics(SM_CXSCREEN)>=1024) then begin liste_rectangle.Add(Tcommande.Create(700,4,1200,12,' Axes ',unit_menu.id_menu_boite_magique_tracer_les_axes_du_cercle)); liste_rectangle.Add(Tcommande.Create(700,22,1200,20,' Quartiers ',unit_menu.id_effets_cercle_ajouter_des_quartiers)); liste_rectangle.Add(Tcommande.Create(700,22+18,1200,30,' Moire ',unit_menu.id_effets_cercle_ajouter_tracer_une_moire)); end; end else if l_element.is_que_des_lignes then begin if (l_element.elements.count=2) then begin strcopy(pc_commentaire,'Une ligne est sélectionnée,'); real_to_pchar_format(relation.log_pouce_to_10mm_real(l_element.epaisseur)/10,pc_stroke_ligne,3,1); strcat(pc_commentaire,pchar(' épaisseur = '+strpas(pc_stroke_ligne)+' mm')); liste_rectangle.Add(TRectControle.Create(10,2,200,32,strpas(pc_commentaire),'',0)); strcopy(pc_commentaire,'Sa longueur est de '); plot:=font_ob1.testnode(l_element.elements.at(1)); une_dist:=relation.log_pouce_to_10mm(utile.distance(0,0,plot.x,plot.y)); //cette distanceest en twips real_to_pchar_format(une_dist/10,pc_stroke_ligne,3,4); strcat(pc_commentaire,pchar(strpas(pc_stroke_ligne)+' mm')); liste_rectangle.Add(TRectControle.Create(10,18,200,32,strpas(pc_commentaire),'',0)); un_angle:=utile.angle_degree(0,0,plot.x,plot.y); strcopy(pc_commentaire,'Cette ligne forme un angle de '); real_to_pchar_format(un_angle,pc_stroke_ligne,3,2); strcat(pc_commentaire,pchar(strpas(pc_stroke_ligne)+'°')); liste_rectangle.Add(TRectControle.Create(10,34,200,32,strpas(pc_commentaire),'',0)); if (Getsystemmetrics(SM_CXSCREEN)>1280) then begin liste_rectangle.Add(Tcommande.Create(1040,2,1200,16,' Ajouter des flèches ',unit_menu.id_menu_afficher_les_fleches)); liste_rectangle.Add(Tcommande.Create(1040,23,1200,16,' Inverser le sens ',unit_menu.id_effets_ligne_inverser_le_sens)); liste_rectangle.Add(Tcommande.Create(1040,44,1200,16,' Ajouter une cote ',unit_menu.id_menu_afficher_la_cotation)); liste_rectangle.Add(TBitmapControle.Create(1180,16,101,unit_menu.id_menu_afficher_la_grille_de_repere, z_open_file.string_afficher_la_palette,unit_menu.id_menu_option_la_grille_de_repere)); end else begin liste_rectangle.Add(Tcommande.Create(700,2,900,16,' Ajouter des flèches ',unit_menu.id_menu_afficher_les_fleches)); liste_rectangle.Add(Tcommande.Create(700,23,900,16,' Inverser le sens ',unit_menu.id_effets_ligne_inverser_le_sens)); liste_rectangle.Add(Tcommande.Create(700,44,900,16,' Ajouter une cote ',unit_menu.id_menu_afficher_la_cotation)); liste_rectangle.Add(TBitmapControle.Create(830,16,101,unit_menu.id_menu_afficher_la_grille_de_repere, z_open_file.string_afficher_la_palette,unit_menu.id_menu_option_la_grille_de_repere)); end; end else begin if l_element.is_fermer then strcopy(pc_commentaire,'Un polygone est sélectionnée,') else strcopy(pc_commentaire,'Une polyligne est sélectionnée,'); real_to_pchar_format(relation.log_pouce_to_10mm_real(l_element.epaisseur)/10,pc_stroke_ligne,3,1); strcat(pc_commentaire,pchar(' épaisseur = '+strpas(pc_stroke_ligne)+' mm')); liste_rectangle.Add(TRectControle.Create(10,2,200,32,strpas(pc_commentaire),'',0)); {---} if l_element.is_fermer then strcopy(pc_commentaire,'Ce polygone est constitué de ') else strcopy(pc_commentaire,'Cette suite est constituée de '); inttopchar(pred(l_element.elements.count),apc); strcat(strcat(pc_commentaire,apc),' segments.'); liste_rectangle.Add(TRectControle.Create(10,18,200,32,strpas(pc_commentaire),'',0)); if not l_element.is_fermer then liste_rectangle.Add(Tcommande.Create(10,40,200,48,' Voulez-vous colorier cette ensemble ',unit_menu.id_popup_fermer)); if (Getsystemmetrics(SM_CXSCREEN)>1280) then begin liste_rectangle.Add(TBitmapControle.Create(1180,16,101,unit_menu.id_menu_afficher_la_grille_de_repere, z_open_file.string_afficher_la_palette,unit_menu.id_menu_option_la_grille_de_repere)); end; end; end else if true then begin if l_element.is_fermer then strcopy(pc_commentaire,'Un polygone est sélectionnée,') else strcopy(pc_commentaire,'Une polyligne est sélectionnée,'); real_to_pchar_format(relation.log_pouce_to_10mm_real(l_element.epaisseur)/10,pc_stroke_ligne,3,1); strcat(pc_commentaire,pchar(' épaisseur = '+strpas(pc_stroke_ligne)+' mm')); liste_rectangle.Add(TRectControle.Create(10,2,200,32,strpas(pc_commentaire),'',0)); {---} if l_element.is_fermer then strcopy(pc_commentaire,'Ce polygone est constitué de ') else strcopy(pc_commentaire,'Cette suite est constituée de '); inttopchar(pred(l_element.elements.count),apc); strcat(strcat(pc_commentaire,apc),' segments.'); liste_rectangle.Add(TRectControle.Create(10,18,200,32,strpas(pc_commentaire),'',0)); if not l_element.is_fermer then liste_rectangle.Add(Tcommande.Create(10,40,200,48,' Voulez-vous colorier cette ensemble ',unit_menu.id_popup_fermer)); if (Getsystemmetrics(SM_CXSCREEN)>1280) then begin liste_rectangle.Add(TBitmapControle.Create(1180,16,101,unit_menu.id_menu_afficher_la_grille_de_repere, z_open_file.string_afficher_la_palette,unit_menu.id_menu_option_la_grille_de_repere)); end; end; resultat:=getsystemmetrics(SM_CXSCREEN); if resultat>=1680 then begin for i:=1 to 20 do for j:=1 to 3 do begin strcopy(pc_une_taille,pchar(floattostr((i+pred(j)*20)/10))); {Denis BERTIN} if strlen(pc_une_taille)=1 then strcat(pc_une_taille,',0'); liste_rectangle.Add(TSizeControle.Create( 340+i*32,3+pred(j)*20,340+i*32+20,3+pred(j)*20+20,pc_une_taille,'',0)); {denis Bertin} end; end else begin for i:=1 to 10 do for j:=1 to 3 do begin strcopy(pc_une_taille,pchar(floattostr(((i+pred(j)*10)/10)))); if strlen(pc_une_taille)=1 then strcat(pc_une_taille,',0'); liste_rectangle.Add(TSizeControle.Create( 340+i*32,3+pred(j)*20,340+i*32+20,3+pred(j)*20+20,pc_une_taille,'',0)); {denis Bertin} end; end; end; //un élément de dessin end; //Un seul élément est sélectionné. end; liste_rectangle.Add(TCloseControle.Create(arect.right-16,arect.top+2)); liste_rectangle.Add(TColorControle.Create(arect.right-16,arect.top+20)); liste_rectangle.Add(TRainbowControle.Create(arect.right-16,arect.top+36,arect.right-6,arect.top+46)); liste_rectangle.Add(THelpButtonControle.Create(arect.right-16,arect.top+50,arect.right-6,arect.top+60)); invalidaterect(self.hwindow,nil,false); end; {TWindowControle.actualiser} {------------------------------------------------------------------------------} constructor THelpButtonControle.Create(left,top,right,bottom:integer); begin inherited Create(left,top,right,bottom,'','',0); end; {THelpButtonControle.Create} procedure THelpButtonControle.paint(adc:hdc); var afont:hfont; begin wutil.Soft_interro(adc,self.son_Rectangle); end; function THelpButtonControle.clic(apoint:tpoint; right:boolean):boolean; begin result:=false; if ptinrect(self.son_Rectangle,apoint) then begin result:=true; haide.aide_context(haide.HELPID_Afficher_l_aide_du_panneau_de_controle); end; end; function THelpButtonControle.situer(apoint:tpoint):boolean; begin result:=false; if ptinrect(self.son_Rectangle,apoint) then begin result:=true; if wmain.Status_window<>nil then wmain.Status_window.Show_a_message_court(z_open_file.string_Afficher_l_aide); end; end; {------------------------------------------------------------------------------} constructor TRainbowControle.Create(left,top,right,bottom:integer); begin inherited Create(left,top,right,bottom,'','',0); end; {TRainbowControle.Create} procedure TRainbowControle.paint(adc:hdc); begin with self.son_Rectangle do wutil.Soft_circle(adc,(left+right) div 2,(top+bottom) div 2,5); end; function TRainbowControle.clic(apoint:tpoint; right:boolean):boolean; var arect:trect; begin result:=false; if ptinrect(self.son_Rectangle,apoint) then begin result:=true; wmain.Wincontrole.Show_les_controle:=true; if right then wmain.Wincontrole.Show_les_controle:=not wmain.Wincontrole.Show_les_controle; if wmain.Wincontrole.Show_les_controle then wmain.Wincontrole.Actualiser else begin wmain.Wincontrole.bool_forcer_l_affichage_des_couleur:=true; wmain.Wincontrole.bool_afficher_l_ecran_de_sauvegarde:=false; wmain.Wincontrole.liste_rectangle.freeall; getclientrect(wmain.Wincontrole.hwindow,arect); wmain.Wincontrole.liste_rectangle.Add(TCloseControle.Create(arect.right-16,arect.top+2)); wmain.Wincontrole.liste_rectangle.Add(TColorControle.Create(arect.right-16,arect.top+20)); wmain.Wincontrole.liste_rectangle.Add(TRainbowControle.Create(arect.right-16,arect.top+36,arect.right-6,arect.top+46)); end; invalidaterect(wmain.Wincontrole.hwindow,nil,true); {écrit par Bertin} end; end; function TRainbowControle.situer(apoint:tpoint):boolean; begin result:=false; if ptinrect(self.son_Rectangle,apoint) then begin result:=true; if wmain.Status_window<>nil then wmain.Status_window.Show_a_message_court(z_open_file.string_afficher_la_palette); end; end; {TRainbowControle.situer} procedure TWindowControle.Paint(PaintDC: HDC; var PaintInfo: TPaintStruct); var i:integer; arect:trect; memdc:hdc; abrush:hbrush; old_bitmap:hbitmap; un_controle:wcontrol.TRectControle; begin getclientrect(self.hwindow,arect); memdc:=createcompatibledc(paintdc); with arect do old_bitmap:=selectobject(memdc,createcompatiblebitmap(paintdc,right,bottom)); if bool_afficher_l_ecran_de_sauvegarde then begin abrush:=selectobject(memdc,CreatesolidBrush(g_base.rgb_bleu)); with arect do rectangle(memdc,pred(left),pred(top),succ(right),succ(bottom)); deleteobject(selectobject(memdc,abrush)); end else begin with arect do rectangle(memdc,pred(left),pred(top),succ(right),succ(bottom)); if self.bool_aucune_element_de_selectionner or self.bool_forcer_l_affichage_des_couleur then self.paint_palette_neochrome(memdc); end; if true then begin for i:=0 to pred(liste_rectangle.count) do begin un_controle:=wcontrol.TRectControle(liste_rectangle.at(i)); if un_controle<>nil then un_controle.paint(memdc); end; end; moveto(memdc,0,pred(arect.bottom)-1); lineto(memdc,succ(arect.Right),pred(arect.bottom)-1); with arect do bitblt(paintdc,0,0,right,bottom,memdc,0,0,SRCCOPY); {bertin} deleteobject(selectobject(memdc,old_bitmap)); deleteDC(memdc); end; procedure TWindowControle.WMLButtonDown(var Msg: TMessage); var i:integer; un_controle:wcontrol.TRectControle; point_souris:tpoint; arect:trect; une_couleur:tcolorref; begin if (wmain.MainWindow<>nil) and (wmain.MainWindow.Aide) then begin wmain.MainWindow.is_aide_context(HELPID_Afficher_l_aide_du_panneau_de_controle); exit; end; point_souris.x:=Smallint(loword(msg.lparam)); point_souris.y:=Smallint(hiword(msg.lparam)); for i:=0 to pred(liste_rectangle.count) do begin un_controle:=wcontrol.TRectControle(liste_rectangle.at(i)); if un_controle<>nil then if un_controle.clic(point_souris,False) then exit; end; if self.bool_aucune_element_de_selectionner or self.bool_forcer_l_affichage_des_couleur then begin getclientrect(self.hwindow,arect); une_couleur:=hls_rvb.Get_HLS_RGB((360*point_souris.x) div pred(arect.right),1*point_souris.y/pred(arect.bottom),1); u_object.brush1_actif.lbcolor:=une_couleur; sendmessage(wmain.MainWindow.hwindow,wmenuK.wm_set_couleur,ord(u_object.TQA_fond),une_couleur); if (wmain.MainWindow<>nil) and (wmain.MainWindow.window_bitmap<>nil) then invalidaterect(wmain.MainWindow.window_bitmap.hwindow,nil,false); end; end; procedure TWindowControle.WMRButtonDown(var Msg: TMessage); var i:integer; une_couleur:tcolorref; arect:trect; point_souris:tpoint; un_controle:wcontrol.TRectControle; begin if (wmain.MainWindow<>nil) and (wmain.MainWindow.Aide) then begin wmain.MainWindow.is_aide_context(haide.HELPID_Afficher_l_aide_du_panneau_de_controle); exit; end; point_souris.x:=Smallint(loword(msg.lparam)); point_souris.y:=Smallint(hiword(msg.lparam)); for i:=0 to pred(liste_rectangle.count) do begin un_controle:=wcontrol.TRectControle(liste_rectangle.at(i)); if un_controle<>nil then if un_controle.clic(point_souris,true) then exit; end; if self.bool_aucune_element_de_selectionner or self.bool_forcer_l_affichage_des_couleur then begin getclientrect(self.hwindow,arect); une_couleur:=hls_rvb.Get_HLS_RGB((360*point_souris.x) div pred(arect.right),point_souris.y/pred(arect.bottom),1); u_object.pen1_actif.lopncolor:=une_couleur; Sendmessage(MainWindow.hwindow,wmenuK.wm_set_couleur,ord(u_object.TQA_encre),une_couleur); if (wmain.MainWindow<>nil) and (wmain.MainWindow.window_bitmap<>nil) then invalidaterect(wmain.MainWindow.window_bitmap.hwindow,nil,false); end; end; procedure TWindowControle.WMMouseMove(var Msg: TMessage); var i:integer; apc:pc100; une_couleur:tcolorref; arect:trect; point_souris:tpoint; un_controle:wcontrol.TRectControle; begin if (wmain.MainWindow<>nil) and (wmain.MainWindow.Aide) then begin setcursor(haide.G_Cursor.HelpCursor); exit; end; point_souris.x:=Smallint(loword(msg.lparam)); point_souris.y:=Smallint(hiword(msg.lparam)); for i:=0 to pred(liste_rectangle.count) do begin un_controle:=wcontrol.TRectControle(liste_rectangle.at(i)); if un_controle<>nil then if un_controle.situer(point_souris) then exit; end; getclientrect(self.hwindow,arect); une_couleur:=hls_rvb.Get_HLS_RGB((360*point_souris.x) div pred(arect.right),point_souris.y/pred(arect.bottom),1); if wmain.Status_window<>nil then begin wmain.Status_window.local_TcolorRef_to_text_html(une_couleur,apc,True); invalidaterect(wmain.Status_window.hwindow,nil,false); updatewindow(wmain.Status_window.hwindow); end; end; {TWindowControle.WMMouseMove} procedure TWindowControle.WMCommand(var Msg: TMessage); var un_Tedit_filename:wcontrol.Tedit_filename; ReveiveControle:wcontrol.TReveiveControle; pc_name_of_complet_path:pc1024; lb_continuer_la_sauvegarde:boolean; Pc_absolute_private_window_name:pc1024; Edit_filename:wcontrol.Tedit_filename; begin inherited WMCommand(Msg); case msg.wparam of id_menu_imprimer: begin postmessage(wmain.MainWindow.hwindow,wm_command,unit_menu.id_menu_imprimer,0); end; id_menu_ouvrir: begin TOpenAfile.Create(self); end; {id_menu_ouvrir} id_menu_file_save_as: begin //Si cette condition est présente le fichier à déjà été enregistré mais si lParam=1 alors demander aussi le nom du fichier. if (Msg.lParam<>1) and (u_object.global_afficher_le_source_code and (strpos(pchar(u_object.global_nom_string_du_code_source),wproche.kpc_Maintain_ato)=nil)) then begin Postmessage(wmain.MainWindow.hwindow,wm_command,unit_menu.id_menu_file_save,0); exit; end; liste_rectangle.freeall; liste_rectangle.add(Tedit_filename.Create(80,20,580,54)); {Le contrôle d'édition} liste_rectangle.add(TRectControle.Create(8,2,200,16,'Donner un nom à ce document:','',0)); liste_rectangle.add(wcontrol.TReveiveControle.Create(610,16,105,id_valider_la_saisie,'Valider la saisie!')); liste_rectangle.add(wcontrol.TReveiveControle.Create(666,16,106,id_invalider_la_saisie,'Annuler l''enregistrement')); ReveiveControle:=wcontrol.TReveiveControle(self.liste_rectangle.at(2)); ReveiveControle.visible:=false; self.bool_afficher_l_ecran_de_sauvegarde:=true; invalidaterect(self.hwindow,nil,false); setfocus(self.hwindow); end; {id_menu_file_save_as} id_valider_la_saisie: begin un_Tedit_filename:=wcontrol.Tedit_filename(self.liste_rectangle.at(0)); //box(self.hwindow,pchar(un_Tedit_filename.filename)); Self.Get_Name_of_path(pc_name_of_complet_path); edit_filename:=wcontrol.Tedit_filename(self.liste_rectangle.at(0)); strcat(strcat(strcat(pc_name_of_complet_path,'\'),pchar(edit_filename.filename)),wmenuk.point_ato); lb_continuer_la_sauvegarde:=true; //Si le fichier existe déjà confirmer le remplacement. if wutil.file_existe(pc_name_of_complet_path) then begin if k_erreur.MessageBox_printf(self.hwindow, k_erreur.Err_File_exist,Mb_iconQUestion or mb_yesno,pc_name_of_complet_path)=id_Yes then begin lb_continuer_la_sauvegarde:=true; end else begin lb_continuer_la_sauvegarde:=False; end; end; if lb_continuer_la_sauvegarde then begin u_object.global_afficher_le_source_code:=true; u_object.global_nom_string_du_code_source:=strpas(pc_name_of_complet_path); wmain.MainWindow.Sauvegarder_en_ATO(u_object.global_nom_string_du_code_source); fillchar(Pc_absolute_private_window_name,pred(sizeof(Pc_absolute_private_window_name)),#0); Strcat(Strcat(Strcopy(Pc_absolute_private_window_name,k_DenisDraw),wutil.kpc_space),pchar(u_object.global_nom_string_du_code_source)); SetwindowText(wmain.Cadre_window.hwindow,Pc_absolute_private_window_name); wmain.MainWindow.Save_ce_nom_de_fichier_dans_project(pchar(u_object.global_nom_string_du_code_source)); Wmain.Cadre_window.Ajouter_le_menu; end; self.bool_afficher_l_ecran_de_sauvegarde:=false; self.Actualiser; end; id_invalider_la_saisie: postmessage(self.hwindow,WM_KeyDown,VK_ESCAPE,0); end; {case msg.wparam} end; {TWindowControle.WMCommand} procedure TWindowControle.paint_palette_neochrome(PaintDC:Hdc); var i,j:integer; arect:trect; begin getclientrect(self.hwindow,arect); for i:=0 to pred(arect.right) do for j:=0 to pred(arect.bottom) do begin setpixel(paintdc,i,j,hls_rvb.Get_HLS_RGB((360*i) div pred(arect.right),1*j/pred(arect.bottom),1)); end; end; procedure TWindowControle.WMCHAR(var msg:TMessage); var un_Tedit_filename:wcontrol.Tedit_filename; begin if self.bool_afficher_l_ecran_de_sauvegarde then begin un_Tedit_filename:=wcontrol.Tedit_filename(self.liste_rectangle.at(0)); if length(un_Tedit_filename.filename)<40 then begin case msg.wparam of 32..255:un_Tedit_filename.filename:=un_Tedit_filename.filename+chr(msg.wparam); else bip; end {case} end else bip; invalidaterect(self.hwindow,nil,false); end; end; procedure TWindowControle.WMKeyDown(var msg:TMessage); var i:integer; un_Tedit_filename:wcontrol.Tedit_filename; un_nom_de_fichier:string; begin if self.bool_afficher_l_ecran_de_sauvegarde then begin un_Tedit_filename:=wcontrol.Tedit_filename(self.liste_rectangle.at(0)); case msg.wparam of VK_ESCAPE: begin self.bool_afficher_l_ecran_de_sauvegarde:=false; self.Actualiser; end; VK_BACK: begin un_nom_de_fichier:=''; for i:=1 to pred(length(un_Tedit_filename.filename)) do un_nom_de_fichier:=un_nom_de_fichier+un_Tedit_filename.filename[i]; un_Tedit_filename.filename:=un_nom_de_fichier; end; VK_RETURN: postmessage(self.hwindow,wm_command,id_valider_la_saisie,0); end; {case} invalidaterect(self.hwindow,nil,false); end; end; {TWindowControle.WMKeyDown} procedure TWindowControle.WMTimer(var msg:TMessage); var ReveiveControle:wcontrol.TReveiveControle; edit_filename:wcontrol.Tedit_filename; begin if self.bool_afficher_l_ecran_de_sauvegarde then begin ReveiveControle:=wcontrol.TReveiveControle(self.liste_rectangle.at(2)); Edit_filename:=wcontrol.Tedit_filename(self.liste_rectangle.at(0)); Edit_filename.timer; if length(Edit_filename.filename)<>0 then begin if not ReveiveControle.visible then invalidaterect(self.hwindow,nil,false); ReveiveControle.visible:=true end else begin if ReveiveControle.visible then invalidaterect(self.hwindow,nil,false); ReveiveControle.visible:=False; end; end; end; {TWindowControle.WMTimer} procedure TWindowControle.WMVSCROLL(var Msg: TMessage); begin end; {TWindowControle.WMVSCROLL} {De ce fait chaque utilisateur inscrt dans la base de registre frait en sorte} procedure TWindowControle.Get_Name_of_path(pc_name_of_complet_path:pchar); var an_openwith_key:hkey; registre:Registry.TRegistry; nom_de_l_utilisateur,coquille:string; return_string:classes.tstrings; begin strcopy(pc_name_of_complet_path,'c:\users\'); registre:=TRegistry.Create; Registre.RootKey:=HKEY_LOCAL_MACHINE; if registre.OpenKey('\SOFTWARE\Microsoft\Windows NT\CurrentVersion',false) then begin nom_de_l_utilisateur:=Registre.ReadString('RegisteredOwner'); Strcat(pc_name_of_complet_path,pchar(nom_de_l_utilisateur)); Strcat(pc_name_of_complet_path,'\DenisDraw'); Wutil.Verif_et_creer_repertoire(pc_name_of_complet_path); {$ifdef debug} box(0,pc_name_of_complet_path); {$endif debug} end; Registre.CloseKey; Registre.Free; end; {TWindowControle.Get_Name_of_file} procedure TWindowControle.Open_A_File_name(Filename:pchar); var s_chemin_complet_plus_nom_de_fichier:string; pc_ce_chemin:pc1024; begin self.Get_Name_of_path(pc_ce_chemin); s_chemin_complet_plus_nom_de_fichier:=strpas(pc_ce_chemin)+wutil.PC_Anti_slash+strpas(Filename)+wmenuk.point_ato; if wmain.MainWindow<>nil then wmain.MainWindow.Lecture_du_fichier(s_chemin_complet_plus_nom_de_fichier); end; end. //Ecrit par denis bertin ce jour de l'an de grâce 2013 february the 13.