Discussion:
VBA Schriftfarbe Benutzerdefiniert ändern
(zu alt für eine Antwort)
ITSystems Arno Lesmeister
2006-12-27 13:46:02 UTC
Permalink
Hallo NG,

nachträglich frohe Weinachten. Ich benutze Word 2003 und möchte wenn ich
unter Menüpunkt Format Zeichen auswähle, die Schriftfarbe Benutzerdefinert
aufrufe das Dialogfenster Farben - Benutzerdefiniert gerne in meiner Word -
Anwendung integrieren.

Allerdings sollte nur noch der Reiter Benutzerdefiniert auswählbar sein, das
Farbmodell RGB festeingestellt sein so das keine Änderungen vorgenommen
werden können und das selbe sollte auch für die Farbwerte sein die ein Max
bekommen und ein Min bekommen.

Hat jemand eine Idee, wie man diese verstecken oder ausblenden kann? Ich
hoffe ich konnte mich einigermassen ausdrücken, ansonsten bitte einfach
nochmals posten, ich versuche es so gut wie möglich zu erklären.

Nette Grüße
Arno
Cindy M.
2006-12-27 16:44:40 UTC
Permalink
Hi Arno,
Ich benutze Word 2003 und möchte wenn ich
unter Menüpunkt Format Zeichen auswähle, die Schriftfarbe Benutzerdefinert
aufrufe das Dialogfenster Farben - Benutzerdefiniert gerne in meiner Word -
Anwendung integrieren.
Allerdings sollte nur noch der Reiter Benutzerdefiniert auswählbar sein, das
Farbmodell RGB festeingestellt sein so das keine Änderungen vorgenommen
werden können und das selbe sollte auch für die Farbwerte sein die ein Max
bekommen und ein Min bekommen.
Hat jemand eine Idee, wie man diese verstecken oder ausblenden kann? Ich
hoffe ich konnte mich einigermassen ausdrücken, ansonsten bitte einfach
nochmals posten, ich versuche es so gut wie möglich zu erklären.
Weder das Word- noch das Office-Objektmodell stellt die benötigte Schnittstelle
zur Verfügung. Rein theoretisch wäre es vielleicht möglich, mittels der Windows
API auf das eingeblendete Dialogfeld (Fenster) zuzugreifen und die Felder
sperren oder vorbelegen. Diese Aufgabe sprengt jedoch die Grenzen dieser
Newsgruppe. Du müsstest in einer klassischen VB-Gruppe (also nicht VB.NET)
fragen, wo man sich mit der Windows API befasst.

Cindy Meister
Co-Autor von »Microsoft Word-Programmierung Das Handbuch« (MS Press)
http://www.word.mvps.org
http://homepage.swissonline.ch/cindymeister

Rückfragen & Antworten nur in der Newsgroup, bitte!
Arno Lesmeister
2006-12-27 18:33:45 UTC
Permalink
Hallo Cindy,

danke für deine Antwort. Keine gute Nachrichten für mich. Kann man sowas
nachbauen? In Word - VBA bin ich jetzt nicht so fit das ich sowas aus dem
Stehgreif könnte.

Es steckt folgende Aufgabe dahinter, dass wenn ich in Word die
Formatvorlagen angezeigt bekomme diese per vba(checkbox) auswählen kann und
dort dann über einen zweiten Menüpunkt die Farbe der Überschrift1 ändern
kann.

Das ganze wollte ich als xla als eigentständigen Menüpunkt in die Menüleiste
einpflegen.

Was für alternativen hätte ich denn?

nette Grüße

Arno




"> Weder das Word- noch das Office-Objektmodell stellt die benötigte
Schnittstelle
Post by Cindy M.
zur Verfügung. Rein theoretisch wäre es vielleicht möglich, mittels der Windows
API auf das eingeblendete Dialogfeld (Fenster) zuzugreifen und die Felder
sperren oder vorbelegen. Diese Aufgabe sprengt jedoch die Grenzen dieser
Newsgruppe. Du müsstest in einer klassischen VB-Gruppe (also nicht VB.NET)
fragen, wo man sich mit der Windows API befasst.
Cindy Meister
Co-Autor von »Microsoft Word-Programmierung Das Handbuch« (MS Press)
http://www.word.mvps.org
http://homepage.swissonline.ch/cindymeister
Rückfragen & Antworten nur in der Newsgroup, bitte!
Cindy M.
2006-12-28 09:49:10 UTC
Permalink
Hi Arno,
Post by Arno Lesmeister
danke für deine Antwort. Keine gute Nachrichten für mich. Kann man sowas
nachbauen? In Word - VBA bin ich jetzt nicht so fit das ich sowas aus dem
Stehgreif könnte.
Es steckt folgende Aufgabe dahinter, dass wenn ich in Word die
Formatvorlagen angezeigt bekomme diese per vba(checkbox) auswählen kann und
dort dann über einen zweiten Menüpunkt die Farbe der Überschrift1 ändern
kann.
Das ganze wollte ich als xla als eigentständigen Menüpunkt in die Menüleiste
einpflegen.
Jetzt bin ich etwas verunsichert: "XLA" gehört Excel, nicht Word?

Die Farben können mit RGB-Zahlen festgelegt werden. Problematischer ist die
grafische Anzeige der Farben...

Wie wäre ein UserForm mit einem Label als Vorschau, und drei Textfeldern, um
die RGB-Werte einzugeben. Der Code hinter dem Formular würde die Farbe des
Textes dynamisch anpassen. Hier ein eher einfaches Beispiel (ohne
Fehlerkontrolle, ob einen eingegegenen Wert erlaubt ist)

'Hält fest, ob die Anfangswerte schon vorhanden sind
Private mAktualisiert As Boolean

Private Sub txtB_Change()
If mAktualisiert Then
If Not (txtB.Value = "") Then
VorschauAktualisieren
End If
End If
End Sub

Private Sub txtG_Change()
If mAktualisiert Then
If Not (txtG.Value = "") Then
VorschauAktualisieren
End If
End If
End Sub

Private Sub txtR_Change()
If mAktualisiert Then
If Not (txtR.Value = "") Then
VorschauAktualisieren
End If
End If
End Sub

Private Sub VorschauAktualisieren()
Dim iRed As Integer, iGreen As Integer, iBlue As Integer

iRed = CInt(Me.txtR.Value)
iGreen = CInt(txtG.Value)
iBlue = CInt(txtB.Value)
Label1.ForeColor = RGB(iRed, iGreen, iBlue)
Me.Repaint
End Sub

'Die Anfangswerte eingeben
Private Sub UserForm_Initialize()
txtR.Value = 0
txtG.Value = 0
txtB.Value = 0
mAktualisiert = True
End Sub


Cindy Meister
Co-Autor von »Microsoft Word-Programmierung Das Handbuch« (MS Press)
http://www.word.mvps.org
http://homepage.swissonline.ch/cindymeister

Rückfragen & Antworten nur in der Newsgroup, bitte!
Helmut Weber
2006-12-28 13:59:10 UTC
Permalink
Hallo Arno,

ich spekulieren mal ein bißchen,

für ein Nachbauen des Dialogs scheinst Du mir
die linke Grafik, die fast quadratisch ist,
zu brauchen, wie sie unter Format, Font,
font colors, more colors, custom angezeigt wird.
Vermutlich könnte man sie auch zur Runtime erzeugen.

Die Grafik kriegt z.B. ein Mouse_Down Event.

Private Sub Image1_MouseDown( _
ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal X As Single, _
ByVal Y As Single)
MsgBox "h: " & X & "v: " & Y
End Sub

Dann weißt Du, mal vereinfacht gesagt,
wo Dein User in die Grafik hingeklickt hat.
Zusätzlich kann man die Farbe des Pixels an dieser
Position feststellen, vgl.
http://groups.google.de/group/microsoft.public.vb.general.discussion/browse_thread/thread/4646c68bcb0e2db4/117e73e933dcc8ed?lnk=st&q=mouse+pointer+position+color+group%3Amicrosoft.public.*&rnum=1&hl=de#117e73e933dcc8ed

Davon abhängig wird der Balken rechts erzeugt.
auf diesen wendet man wieder ein Mouse_Down Event an.

Geht schon, ist aber viel Arbeit,
und gegenüber C++ sind die Möglichkeiten
von VBA doch wohl ein wenig beschränkt.
--
Gruß

Helmut Weber, MVP WordVBA

"red.sys" & chr$(64) & "t-online.de"
Win XP, Office 2003 (US-Versions)
ITSystems Arno Lesmeister
2006-12-29 08:25:01 UTC
Permalink
Hallo Helmut,
Post by Helmut Weber
ich spekulieren mal ein bißchen,
für ein Nachbauen des Dialogs scheinst Du mir
die linke Grafik, die fast quadratisch ist,
zu brauchen, wie sie unter Format, Font,
font colors, more colors, custom angezeigt wird.
Vermutlich könnte man sie auch zur Runtime erzeugen.
Du brauchst nicht zu spekulieren, Du liegst da schon richtig.
Post by Helmut Weber
Die Grafik kriegt z.B. ein Mouse_Down Event.
Private Sub Image1_MouseDown( _
ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal X As Single, _
ByVal Y As Single)
MsgBox "h: " & X & "v: " & Y
End Sub
Dann weißt Du, mal vereinfacht gesagt,
wo Dein User in die Grafik hingeklickt hat.
Zusätzlich kann man die Farbe des Pixels an dieser
Position feststellen, vgl.
http://groups.google.de/group/microsoft.public.vb.general.discussion/browse_thread/thread/4646c68bcb0e2db4/117e73e933dcc8ed?lnk=st&q=mouse+pointer+position+color+group%3Amicrosoft.public.*&rnum=1&hl=de#117e73e933dcc8ed
Davon abhängig wird der Balken rechts erzeugt.
auf diesen wendet man wieder ein Mouse_Down Event an.
Geht schon, ist aber viel Arbeit,
und gegenüber C++ sind die Möglichkeiten
von VBA doch wohl ein wenig beschränkt.
Das es so kompliziert wird, hätte ich jetzt nicht gedacht, ich weis das VBA
nicht alsoviel hergibt,
leider kann ich C++ nicht und Word - VBA nur eingeschränkt...

Aber danke für den Link und die Info ich werde mir das zu gemüte führen und
hoffentlich verstehen..

Wünsch dir einen guten Rutsch ins neue Jahr sollten wir uns nicht mehr höhren.

Danke!

Gruß
Arno
Thomas Gahler
2006-12-28 15:53:22 UTC
Permalink
Hallo Arno

Ich mache was ähnliches wie du und könnte dir dir folgendes anbieten.

Ich habe eine UserForm wo man für eine Textbox die Farbe bestimmen
kann/muss. Neben der Textbox habe ich eine Schaltfläche wo man die Frabe
bestimmen kann. Hier rufe ich aus dem CommonDialog den Farben-Dialog auf
(ist der gleiche wie in Paint (Farben / Palette bearbeiten).

Die Grundfarben sind definiert, die Benutzerdefinierten Farben werden in der
Registry abgespeichert. Der Dialog an die UserForm gebunden. Falls das was
ist, dann kann ich den Code soweit zusammenschnippseln, dass er bei dir dann
auch läuft.

Kannst du so was gebrachen? Dann melde dich.
--
Thomas Gahler
MVP für WordVBA
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)

- Windows XP (SP2), Office XP (SP3)
ITSystems Arno Lesmeister
2006-12-29 08:28:00 UTC
Permalink
Hallo Thomas,
Post by Thomas Gahler
Ich mache was ähnliches wie du und könnte dir dir folgendes anbieten.
Ich habe eine UserForm wo man für eine Textbox die Farbe bestimmen
kann/muss. Neben der Textbox habe ich eine Schaltfläche wo man die Frabe
bestimmen kann. Hier rufe ich aus dem CommonDialog den Farben-Dialog auf
(ist der gleiche wie in Paint (Farben / Palette bearbeiten).
Die Grundfarben sind definiert, die Benutzerdefinierten Farben werden in der
Registry abgespeichert. Der Dialog an die UserForm gebunden. Falls das was
ist, dann kann ich den Code soweit zusammenschnippseln, dass er bei dir dann
auch läuft.
Kannst du so was gebrachen? Dann melde dich.
Ja klar kann ich sowas gebrauchen, ich würde dir gerne auch mal mein Picture
zukommen lassen, wie eigentlich das ganze angedacht ist. Vielleicht ist es
dann leichter zu verstehen.

Danke für eure Supper Hilfe......

Ich hab noch eine Frage wie kann ich denn die Formatvorlagen die Word zur
Verfügung stellt in eine Listbox einlesen und links davon eine Checkbox
plazieren. In meinem Bild ist es ersichtlich was ich damit meine.

nette Grüße
Arno
Post by Thomas Gahler
--
Thomas Gahler
MVP für WordVBA
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)
- Windows XP (SP2), Office XP (SP3)
Helmut Weber
2006-12-29 14:07:33 UTC
Permalink
Hallo Arno,
Post by ITSystems Arno Lesmeister
Ich hab noch eine Frage wie kann ich denn die Formatvorlagen die Word zur
Verfügung stellt in eine Listbox einlesen und links davon eine Checkbox
plazieren. In meinem Bild ist es ersichtlich was ich damit meine.
hmm...
aber eher, oh je.

Dim oSty As Style
For Each oSty In ActiveDocument.Styles
ListBox1.AddItem oSty
Next
TextBox1.Text = CStr(ListBox1.ListCount)

Es gibt Table-Styles, wovon man besser die Finger lässt,
nachdem was ich so lese,
List-Styles,
Character-Styles,
und Paragraph-Styles.

Vielleicht habe ich auch noch was vergessen.

Das sind bei mir hier und heute zusammen 158,
und dabei habe ich keine zusätzlichen Styles selbst definiert.

Links von jedem Listbox-Item eine Checkbox platzieren zu wollen,
würde schon Platzprobleme verursachen.
Und was wäre wenn jemand scrollt?

Die Checkboxen wieder alle neu aufbauen?
Das geht nur theoretisch.
Checkbox in einer Listbox geht gleich gar nicht,
jedenfalls nach meinem Kenntnisstand.

Ich glaube, eine Multiselect-Listbox (fmmultiselectextended)
wäre für die vermutete Aufgabe die angemessene Lösung.

Und überhaupt, einen Benutzer eine Farbe nach Augenschein
wählen zu lassen, führt nach meinem Ermessen zu einem Farbchaos.

Viel Spass noch.
--
Gruß

Helmut Weber, MVP WordVBA

"red.sys" & chr$(64) & "t-online.de"
Win XP, Office 2003 (US-Versions)
Thomas Gahler
2006-12-29 16:29:59 UTC
Permalink
Hallo Arno
Post by Thomas Gahler
Kannst du so was gebrachen? Dann melde dich.
Ja klar kann ich sowas gebrauchen, [...]
Werde ich dir heute oder morgen dann mal zusammenstellen.
ich würde dir gerne auch mal mein Picture
zukommen lassen, wie eigentlich das ganze angedacht ist. Vielleicht ist es
dann leichter zu verstehen.
Kann mir das so ungefähr schon vorstellen. Kannst das Bildchen trotzdem mal
rüberflüstern
Ich hab noch eine Frage wie kann ich denn die Formatvorlagen die Word zur
Verfügung stellt in eine Listbox einlesen und links davon eine Checkbox
plazieren.
Schalt doch einfach die entsprechende Eigenschaft ein ;-))

- ListBox1.ListStyle = fmListStyleOption

Checkbox gibt es aber nur bei Mulitselect und das hast du ja nicht, dann
gibt es eben eine OptionButton was ja passender ist ;-)


@Helmut, vielleicht mal ein wenig die Eigenschaften der Controlls ein wenig
studieren, kannst du ja am 31. machen und dann pünktlich auf die neuen
Erkenntnisse anstossen ;-)))



Das einlesen der Formatvorlagen hat dir Helmut ja gezeigt. Du kannst die
.Type-Eigenschaft auswerten, wenn du nur bestimmte Formatvorlagen willst

Dim sty As Word.Style
sty.Type
wdStyleTypeCharacter
wdStyleTypeList
wdStyleTypeParagraph
wdStyleTypeTable
--
Thomas Gahler
MVP für WordVBA
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)

- Windows XP (SP2), Office XP (SP3)
Helmut Weber
2006-12-29 16:46:35 UTC
Permalink
Hallo Thomas,

danke für den Wink mit dem Zaunpfahl. :-)

Liststyle fmliststyleoption

Immerhin habe ich nicht bis zum 31 gebraucht.
--
Gruß

Helmut Weber, MVP WordVBA

"red.sys" & chr$(64) & "t-online.de"
Win XP, Office 2003 (US-Versions)
Thomas Gahler
2006-12-29 19:09:28 UTC
Permalink
Hallo Arno
mach ich doch gerne, wenn ich Deine Mail Adresse habe. Ich weis nicht ob
ich
hier Bilder posten darf sonst hätte ich es hier schon getan.
Die ist im Header eines jeden Postings. Einfach dir grossen Buchstaben weg
lassen...
Post by Thomas Gahler
Checkbox gibt es aber nur bei Mulitselect und das hast du ja nicht, dann
gibt es eben eine OptionButton was ja passender ist ;-)
Im Prinzip ist es eigentlich egal, sag ich mal so in meinem Leichtsinn.
Muss
es nur meinem Chef verkaufen können, das die Checkbox die schlechtere Wahl
ist :-)).
Da muss man nichts verkaufen
Checkbox = 1 bis n einzelen Möglichkeiten können ausgewählt werden
OptionButton = 1 aus einer Gruppe von Möglichkeiten kann ausgewählt werden
--
Thomas Gahler
MVP für WordVBA
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)

- Windows XP (SP2), Office XP (SP3)
Thomas Gahler
2006-12-30 13:50:40 UTC
Permalink
Hallo Arno
Post by Thomas Gahler
Werde ich dir heute oder morgen dann mal zusammenstellen.
prima, bin morgen auch online.
Also hier kommt was

Mach eine neues Projket
Erzeuge eine neue Userform (UserForm1)
Setze eine Textbox drauf (Textbox1)
Setze einen Commandbutton drauf (Commandbutton1)
Füge den nachstehenden Code in die entsprechenen Stellen ein

' --------- --------- --------- Start Modul1 --------- --------- ---------
Option Explicit

Public Const tgREGISTRY_KEY As String = "HKEY_CURRENT_USER\Software\Thomas
Gahler\CH4Makros\Word"

Public vDummy As Variant

Sub Demo()
UserForm1.Show
End Sub

' --------- --------- --------- Ende Modul1 --------- --------- ---------


' --------- --------- --------- Start
modRegistryUndINI --------- --------- ---------
Option Explicit

Private Const tgTEILSTRING_A255 As Integer = 5

Public Function funcGetPrivateProfileString( _
ByVal cDatei As String, _
ByVal CAbschnitt As String, _
ByVal CEintrag As String, _
ByVal CVorgabe As String) _
As Variant
'Die Funktion «funcGetPrivateProfileString» erweitert die Standardfunktion
'«PrivateProfileString» in sofern, dass ein Vorgabewert übergeben werden
'kann, welcher zurückgegeben wird falls der gesuchte Eintrag nicht gefunden
'wird.
Dim vWert As Variant

'Gesuchten Wert aus der Datei einlesen.
On Error Resume Next
vWert = System.PrivateProfileString(cDatei, CAbschnitt, CEintrag)
On Error GoTo 0

'Falls der Eintrag nicht vorhanden ist, Vorgabewert setzen.
If Len(vWert) = 0 Then
vWert = CVorgabe
End If

'Deutsche (Wahr, Falsch) String-Parameter in englische Boolean-Werte (True,
False) übersetzen.
If LCase$(vWert) = LCase$("Wahr") Then vWert = True
If LCase$(vWert) = LCase$("Falsch") Then vWert = False
If LCase$(vWert) = LCase$("True") Then vWert = True
If LCase$(vWert) = LCase$("False") Then vWert = False

funcGetPrivateProfileString = vWert
End Function

Public Function funcWritePrivateProfileString( _
ByVal cDatei As String, _
ByVal CAbschnitt As String, _
ByVal CEintrag As String, _
ByVal cWert As String)
'Wert in Datei schreiben.
System.PrivateProfileString(cDatei, CAbschnitt, CEintrag) = cWert
End Function
' --------- --------- --------- Ende
modRegistryUndINI --------- --------- ---------


' --------- --------- --------- Start
UserForm1 --------- --------- ---------
Option Explicit

'API-Call zum suchen des Handles des aktiven Fensters.
Private Declare Function GetActiveWindow Lib "user32" () As Long

'API-Call zum aufrufen des Dialoges «Farben» (CommenDialog),
'mit Definition der zugehörigen Datenstruktur.
Private Declare Function ChooseColorAPI Lib "comdlg32.dll" Alias
"ChooseColorA" (pChoosecolor As CHOOSECOLOR) As Long
Private Type CHOOSECOLOR
lStructSize As Long
hwndOwner As Long
hInstance As Long
rgbResult As Long
lpCustColors As String
flags As Long
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type

Private Sub CommandButton1_Click()
Const tgBENUTZER_FARBEN As String = "÷o,ûè`»è`?æ"oíët­íÌ-éÜa°ûÐÄüâ-Öì'¶ñ·Î÷õ©ÇóÚµðìŠÎ"

Dim cc As CHOOSECOLOR
Dim CustomColors() As Byte
Dim lReturn As Long
Dim iZähler As Integer
Dim iPosition As Integer
Dim cBenutzerFarben As String

'Werte vorbelegen.
cBenutzerFarben = funcGetPrivateProfileString("", tgREGISTRY_KEY &
"\DokumentAssistent\Farbe", "BenutzerFarbenPalette", tgBENUTZER_FARBEN)
If Len(cBenutzerFarben) <> Len(tgBENUTZER_FARBEN) Then
cBenutzerFarben = cBenutzerFarben & String$(Len(tgBENUTZER_FARBEN) -
Len(cBenutzerFarben), Chr(0))
End If

'Das Format von 'lpCustColors' besteht aus 16 Farben welche mit 3 RGB-Werten
definert
'werden, jeder Wert wird mit einem 0 (Null) getrennt. Somit muss das Array
'CustomColors()'
'aus 64 Werten bestehen 16*(3+1) = 64 (also von 0 bis 63,
'xxx0yyy0...0zzz0').
'Benutzerdefinierte Farben zuerst auf schwarz setzen.
ReDim CustomColors(0 To 63) As Byte
For iZähler = LBound(CustomColors) To UBound(CustomColors)
CustomColors(iZähler) = 0
Next iZähler
'Benutzerdefinierte Farben mit den eigenen Werten belegen. Die Konstante
'bkBENUTZER_FARBEN'
'besteht nur aus den eigentlichen Werten ('xxxyyy...zzz') die 0 (Null)
wird in der
'FOR-Schleife hinzugefügt ('xxx0yyy0...0zzz0').
For iZähler = LBound(CustomColors) + 1 To UBound(CustomColors) + 1
If iZähler Mod 4 <> 0 Then
iPosition = iPosition + 1
CustomColors(iZähler - 1) = Asc(Mid$(cBenutzerFarben, iPosition,
1))
Else
CustomColors(iZähler - 1) = 0
End If
Next iZähler

'Datenstruktur der Funktion 'ChooseColorAPI' vorbelegen.
cc.lStructSize = Len(cc)
cc.hwndOwner = GetActiveWindow()
cc.hInstance = 0
cc.lpCustColors = StrConv(CustomColors, vbUnicode)
cc.flags = 0

'API-Call starten.
lReturn = ChooseColorAPI(cc)
If lReturn <> 0 Then
TextBox1.BackColor = cc.rgbResult
vDummy = funcWritePrivateProfileString("", tgREGISTRY_KEY &
"\DokumentAssistent\Farbe", "BenutzerFarbenHintergrund", cc.rgbResult)
'Benutzerdefinierte Farben aus Array auslesen.
cBenutzerFarben = ""
CustomColors = StrConv(cc.lpCustColors, vbFromUnicode)
For iZähler = LBound(CustomColors) + 1 To UBound(CustomColors) + 1
If iZähler Mod 4 <> 0 Then
cBenutzerFarben = cBenutzerFarben & Chr(CustomColors(iZähler -
1))
End If
Next iZähler
'Benutzerdefinierte Farben abspeichern.
If tgBENUTZER_FARBEN <> cBenutzerFarben Then
vDummy = funcWritePrivateProfileString("", tgREGISTRY_KEY &
"\DokumentAssistent\Farbe", "BenutzerFarbenPalette", cBenutzerFarben)
End If
End If
End Sub
' --------- --------- --------- Ende
UserForm1 --------- --------- ---------




Alles klar?
--
Thomas Gahler
MVP für WordVBA
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)

- Windows XP (SP2), Office XP (SP3)
Helmut Weber
2006-12-30 15:11:40 UTC
Permalink
Hallo Thomas,

ich brauch mal ein bißchen Nachilfe.

Ich habe aus Freude am Experimentieren einen ganz anderen Weg gewählt,
und mich wohl ziemlich verlaufen. ;-)

Ich habe eine Userform mit einem Bildchen drauf,
und kann die Farbe des angeklickten Pixels bestimmen,
aber nur, wenn top und left der Userform 0 sind.

Etwas so:

Private Sub Image1_MouseDown( _
ByVal Button As Integer, _
ByVal Shift As Integer, _
ByVal X As Single, _
ByVal Y As Single)
Dim LngTop As Long ' form Top
Dim LngLft As Long ' form Left
LngTop = UserForm1.Top
LngLft = UserForm1.Left
X = X + LngLft + Image1.Left + 18 ' Pixelweise ertastet
Y = Y + LngTop + Image1.Top + 40 ' Pixelweise ertastet
TextBox1.Text = X
TextBox2.Text = Y
TextBox3.BackColor = GetPixel(GetDC(0), X, Y)
End Sub

Verschiebe ich die Userform, klappts nicht mehr.
Da fehlt mir irgendein Parameter, mit dem ich das,
was Image1_mousedown für X und Y liefert,
in das umrechnen kann, was Getpixel erwartet.

Habe beim Googlen screen.twipsperpixelX etc. gefunden.
Aber das kennt VBA doch gar nicht, oder?

Schönen Abend noch.
--
Gruß

Helmut Weber, MVP WordVBA

"red.sys" & chr$(64) & "t-online.de"
Win XP, Office 2003 (US-Versions)
Thomas Gahler
2006-12-30 17:32:06 UTC
Permalink
Hallo Helmut



Vielleicht lieferst du die beiden ja auch noch, dann kann man weitersehen
- GetPixel()
- GetDC()
--
Thomas Gahler
MVP für WordVBA
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)

- Windows XP (SP2), Office XP (SP3)
Helmut Weber
2006-12-30 22:18:43 UTC
Permalink
Hallo Thomas,

Private Declare Function GetDC Lib "user32" ( _
ByVal hWnd As Long) As Long
Private Declare Function GetPixel Lib "gdi32" _
(ByVal hdc As Long, ByVal X As Long, _
ByVal Y As Long) As Long

frag mich nicht, wozu das alles gut ist.

Wenn man erstmal keine Ahnung hat,
schreibt man halt was von anderen ab
und probiert herum.
--
Gruß

Helmut Weber, MVP WordVBA

"red.sys" & chr$(64) & "t-online.de"
Win XP, Office 2003 (US-Versions)
ITSystems Arno Lesmeister
2006-12-31 10:07:00 UTC
Permalink
Hallo Thomas, Hallo Helmut,

vielen Dank für die vielen Tipps und Beispiele die ihr mir gegeben habt. Ich
werde der Thematik Stück für Stück angehen wie empfohlen wurde.

Sollte ich dabei auf Fragen stoßen, die mit Sicherheit auftauchen würde ich
gerne hier im Forum posten.

Ich wünsch euch allen einen guten Rutsch ins neue Jahr.

Arno

Loading...