Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
Comme le titre l'indique, j'ai besoin de redimensionner une image située dans un control RichtextEdit.
En fait, l'image est collée dans un RichtextEdit mais sa taille n'est pas conforme avec la taille d'une page format A4 à l'impression. Pour cela je suis obligé de réduire mon image avant de lancer l'impression.
J'ai essayé de modifier les paramètres height et witdh du controle RichtextEdit mais ce n'est pas la bonne solution puisque je veux afficher toute l'image.
Comment faire pour réduire la taille de l'image ? (ce n'est pas grave si la qualité dégrade un peu ;-)
Merci à tous et bonne journée
Dernière modification par mattdamon (01-10-2011 19:54:24)
Hors ligne
mattdamon a écrit:
En fait, l'image est collé dans un RichtextEdit mais sa taille n'est pas conforme avec la taille d'une page format A4 à l'impression. Pour cela je suis obligé de réduire mon image avec de lancer l'impression.
Je ne suis pas sûr de bien comprendre : l'image fait déjà la taille d'une page A4 et tu souhaites la réduire pour que ça rentre dans les marges d'impression de l'imprimante ?
Hors ligne
Les images dans les richtexts sont carrément intégrées dans le code RTF.
Le seul moyen de la redimensionner est d'en importer une version plus petite que tu auras au préalable modifiée dans un éditeur
type paint par exemple.
Hors ligne
Je n'ai jamais utilisé le RichEdit. Il y a un moyen d'accéder / de manipuler le code rtf dedans ?
Parce que je viens de faire un rapide test avec wordpad.
Soit une image collée dans wordpad, le fichier correspondant donne
{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fcharset0 Arial;}} {\*\generator Msftedit 5.41.15.1515;}\viewkind4\uc1\pard\f0\fs20{\pict\wmetafile8\picwgoal10635\pichgoal6645 010009000003385811000000225811000000050000000b0200000000050000000c02de1d732622 581100430f2000cc000000e402000400000000de1d7326000000002800000000040000e4020000 ... ... 0e24170e24170e24170e24170e24170e24170e24170e24170e24170e24170e24170e24170e2417 0e24170e24170e24170e24170e24170e24170e24170e6767677979799090909494946464640300 00000000 }\par }
Si je redimensionne l'image et que j'enregistre dans un .rtf je remarque que l'image est toujours enregistrée en entier (càd que si je rouvre le fichier, je peux l'agrandir et retrouver l'image de départ. En fait Wordpad fait varier le nombre qui accompagne les paramètres picwgoal et pichgoal visibles à la fin de la 2ème ligne.
Edit : oui, je viens de tester qu'on peut récupérer le code RTF avec CopyRTF(true) et le remplacer avec PasteRTF(), donc en théorie, on peut bricoler le contenu comme on veut à coup de regex ou de Pos(), Mid() et autres. Bon je ne dis pas que c'est facile, juste que ça doit être possible...
Dernière modification par seki (29-09-2011 12:21:32)
Hors ligne
seki a écrit:
mattdamon a écrit:
En fait, l'image est collé dans un RichtextEdit mais sa taille n'est pas conforme avec la taille d'une page format A4 à l'impression. Pour cela je suis obligé de réduire mon image avec de lancer l'impression.
Je ne suis pas sûr de bien comprendre : l'image fait déjà la taille d'une page A4 et tu souhaites la réduire pour que ça rentre dans les marges d'impression de l'imprimante ?
Non, l'image est représente une capture d'écran de tout mon desktop (la même taille que mon desktop).
J'arrive à enregistrer cette image sous word et là le problème.. je vois que l'image dépasse la taille de document word et par la suite dépasse les marges d'impression de l'imprimante.
Sachant que au moment de sauvegarde de l'image, je n'ai pas la main de réduire sa taille. pour cela, j'ai postulé ici pour savoir si c'est possible d'adapter la taille de l'image en la réduisant.
foon a écrit:
Les images dans les richtexts sont carrément intégrées dans le code RTF.
Le seul moyen de la redimensionner est d'en importer une version plus petite que tu auras au préalable modifiée dans un éditeur
type paint par exemple.
Désolé foon, je ne peux importer une version plus petite car j'ai pris l'image à partir d'une capture d'écran en utilisant une API windows (c'est une autre histoire :-) )
En fait, j'ai utilisé ce bout de code qui permet de prendre une capture d'écran de ce qui est affiché sur mon desktop. Mais ce code permet de prendre une capture avec les dimensions réelle de desktop !!!
Vraiment, j'ai essayé de modifier ce code pour prendre une capture d'écran avec des dimensions plus petites mais toujours j'arrive plus
Franchement, voici le code, si quelqu'un peut m'aider ...
http://eric.aling.tripod.com/PB/tips/pbtip35.htm
http://forums.textcontrol.com/archive/i … 09f78e322b
http://sourceforge.net/projects/powerpr … _test=beta
ou
uLong ll_DeskHwnd,ll_hdc,ll_hdcMem ,ll_hBitmap uLong ll_fleft, ll_ftop, ll_fwidth , ll_fheight uLong ll_return // The GetDesktopWindow function returns the handle of the Windows desktop // window. The desktop window covers the entire screen. // The desktop window is the area on top of which all icons and // other windows are painted. ll_DeskHwnd = GetDesktopWindow() // Get in pixel value the x,y,width,height of the window // because of the powerbuilder Units (PBU) ll_fwidth=UnitsToPixels(This.width, XUnitsToPixels!) ll_fheight=UnitsToPixels(This.height, YUnitsToPixels!) ll_fleft=UnitsToPixels(This.X, XUnitsToPixels!) ll_ftop=UnitsToPixels(This.Y, YUnitsToPixels!) // // Get the device context of Desktop and allocate memory // ll_hdc = GetDC(ll_DeskHwnd) ll_hdcMem = CreateCompatibleDC(ll_hdc) ll_hBitmap = CreateCompatibleBitmap(ll_hdc, ll_fwidth, ll_fheight) If ll_hBitmap <> 0 Then ll_return = SelectObject(ll_hdcMem, ll_hBitmap) // // Copy the Desktop bitmap to memory location // ll_return = BitBlt(ll_hdcMem, 0, 0, ll_fwidth, ll_fheight, ll_hdc, ll_fleft, ll_ftop, 13369376) // // try to store the bitmap into a blob so we can save it // this does not always work BTW // long ll_pixels = 1 str_bitmapinfo lstr_Info str_bitmapinfo lstr_InfoDummy str_bitmapheader lstr_Header lstr_Info.bmiheader.bisize=40 lstr_InfoDummy.bmiheader.bisize=40 // Get the bitmapinfo if GetDIBits(ll_hdcMem, ll_hBitmap, 0, ll_fheight, 0, lstr_Info, 0) > 0 then if lstr_Info.bmiheader.biBitCount = 16 or & lstr_Info.bmiheader.biBitCount = 32 then ll_pixels = lstr_info.bmiheader.biwidth * lstr_info.bmiheader.biheight end if lstr_Info.bmiColor[ll_pixels] = 0 abl_data = blob(space(lstr_Info.bmiheader.bisizeimage)) // get the actual bits GetDIBits(ll_hdcMem, ll_hBitmap, 0, ll_fheight, abl_data, lstr_Info, 0) // create a bitmap header lstr_Header.bfType[1] = 'B' lstr_Header.bfType[2] = 'M' lstr_Header.bfSize = lstr_Info.bmiheader.bisizeimage lstr_Header.bfReserved1 = 0 lstr_Header.bfReserved2 = 0 lstr_Header.bfOffBits = 54 + (ll_pixels * 4) // copy the header structure to a blob blob lbl_header lbl_header = blob(space(14)) CopyBitmapFileHeader(lbl_header, lstr_Header, 14 ) // copy the info structure to a blob blob lbl_info lbl_Info = blob(space(40 + ll_pixels * 4) ) CopyBitmapInfo(lbl_Info, lstr_Info, 40 + ll_pixels * 4 ) // add all together and we have a window bitmap in a blob abl_Data = lbl_header + lbl_info + abl_Data end if // '--------------------------------------------- // ' Set up the Clipboard and copy bitmap // '--------------------------------------------- ll_return = OpenClipboard(ll_DeskHwnd) ll_return = EmptyClipboard() ll_return = SetClipboardData(2, ll_hBitmap) ll_return = CloseClipboard() End If // '--------------------------------------------- // ' Clean up handles // '--------------------------------------------- ll_return = DeleteDC(ll_hdcMem) ll_return = ReleaseDC(ll_DeskHwnd, ll_hdc) return 1
NB : Je dois modifier ce code de telle façon j'obtiens une capture d'écran de tout mon desktop avec les mêmes dimensions d'une page format A4
Une idée ?
Merci !
Dernière modification par mattdamon (05-10-2011 21:26:42)
Hors ligne