I ett formulär så har jag en textbox. i winforms läser du av Top och Lefgt på din textbox och i webforms läser du av Då börjar jag med att testa av så här: Jag rekommenderade Style("left") uti det fall att det var webforms (asp.net), för att ta reda på textboxens position gäller följande: Tack skall du ha. Jag antar att jag är ett steg närmare målet, men det som är intressant är ju insättningspunkten. Insättningspunkten? menar du markörens insättningspunkt i en eventuell text? Jag är rädd att jag inte förstår nu. Jag förstår bara inte vad du menar med insättningspunkt, definiera begreppet så kan vi nog klara ut missförstånden... Jo, i en textbox, när textboxen är markerad, så blinkar insättningspunkten. Det är just där som jag vill att min combobox skall dyka upp, alltså efter all text som etc finns. Hej. Hej Fredrik. Ett fel är att du använder egenskapen .TextLength för att räkna ut högerpositionen för comboboxen. Det blir inte rätt eftersom TextLength returnerar antal tecken i strängen. det killen är ute efter är att få positionen på MARKÖREN. Hej Roggan. jag gissar på att x och y i point'en du får från getcaretpos är i skärm relativa pixel coords.. Du är tydligen ngonting på spåret.Ta reda på insättningspunkten?
Hur tar jag reda på var insättningspunkten är?
(andemeningen är att jag skall få en osynlig listbox (som skall bli osynlig)att dyka upp där).
Vad jag pratar om borde alltså vara x och y.Sv: Ta reda på insättningspunkten?
Style("left") respektive Style("top") på textboxen.Sv: Ta reda på insättningspunkten?
<code>
int theight = textBoxAnteckning.Height;
int tleft = textBoxAnteckning.Left;
string Msg = "Höjd:" + theight.ToString() + " Vänster: " + tleft.ToString();
MessageBox.Show(Msg);
</code>
Detta fungera ju bra, men jag får inte klart för mig vad det är för måtangivelse?
I Messageboxen får jag reda på Hörjd 104 Vänster 8.
(det kanske inte har någon betydelse men iaf)
När jag sen skall försöka mig på att hitta var insättningpunkten är dvs var i texboxen den befinner sig så rekommenderade du Style("left") respektive Style("top") på textboxen.
Jag kan inte hitta dessa egenskaper, jag gör kanske fel, men det närmaste jag kom var:
textBoxAnteckning.StyleChanged("left")
och så här ville han inte ha det.
Skulle du vilja visa hur jag kan få tag på insättningspunkten i textboxen?Sv: Ta reda på insättningspunkten?
<code>
int theight = textBoxAnteckning.Height;
int tleft = textBoxAnteckning.Left;
int ttop = textBoxAnteckning.Top;
int twidth = textBoxAnteckning.Width;
string Msg = "Höjd:" + theight.ToString() + " Vänster: " + tleft.ToString() + " Överkant: " + ttop.ToString() + " Bredd: " + twidth.ToString();
MessageBox.Show(Msg);
</code>
Måttenheten som du får antar jag är pixels men jag är inte 100% säker (har inte jobbat så mycket med winforms än)Sv: Ta reda på insättningspunkten?
Jag har själv ingen ide, men har för mig att i VB tex kunde man ju kolla av med X-Y kordenationerna.
Jag har surfat runt, hittat mycket kul men ändå ingenting som för mig närmare målet.Sv: Ta reda på insättningspunkten?
Om menar kontrollens position så är ju Top = Y-positionen och Left = X-positionen...Sv: Ta reda på insättningspunkten?
Top och Left är ju x , Y för textrutans placering, eller har jag missat någonting nu?Sv: Ta reda på insättningspunkten?
Sv: Ta reda på insättningspunkten?
Sv: Ta reda på insättningspunkten?
Jag försökte med följande teknik som dock behöver finslipas lite för att bli riktigt bra.
I textboxens TextChanged event lade jag in följande kod:
<code>
private void txtBox_TextChanged(object sender, System.EventArgs e) {
Graphics g = txtBox.CreateGraphics();
SizeF f = g.MeasureString (txtBox.Text, txtBox.Font);
tooltip.Top = txtBox.Top;
tooltip.Left = txtBox.Left + f.ToSize().Width ;
}
</code>
tooltip är en liten label som jag positionerar till höger om insättningspunkten i texten.
Jag räknar ut storleken på texten i Textboxen via Graphics objektet MeasureString
metod. Detta värde använder jag sedan för att positionera labeln.
Problemet med denna metod är att den inte räknar trailing whitespace för de upptar
ingen plats s a s enligt MeasureString. Dessutom får jag en förskjutning i högerled
på labeln antagligen beroende på avrundningsfel.
Men det kanske är en liten hjälp på vägen?
Mvh
FredrikSv: Ta reda på insättningspunkten?
Det är ingen ointressant lösning, men efterson jag inte har jobbat med detta, så är det väll bäst att vi fortsätter diskussionerna.
<code>
Graphics g = textBoxAnteckning.CreateGraphics();
SizeF f = g.MeasureString (textBoxAnteckning.Text, textBoxAnteckning.Font);
comboBox1.Top = textBoxAnteckning.Top;
comboBox1.Left = textBoxAnteckning.TextLength + f.ToSize().Width ;
</code>
Så här har jag det nu.
Min comboBox "rör" på sig, men är alldeles fel placerad.
Den känner inte av höjden, utan är i samma höjd som textboxens överkant. Den är också fel i i förhållandet till textBoxens vänsterkant.
Vad tror du?Sv: Ta reda på insättningspunkten?
Du måste utgå från Textboxens vänster position:
comboBox1.Left = textBoxAnteckning.Left + f.ToSize().Width;
Sedan blir jag osäker på var i höjdled du ville placera comboboxen, jag
trodde den skall vara i höjd med textboxen. Om du vill ha den nedanför till
exempel får du lägga till textboxens höjd också:
comboBox1.Top = textBoxAnteckning.Top + textBoxAnteckning.Height;
Hoppas detta blir bättre!
Mvh
Fredrik
Sv: Ta reda på insättningspunkten?
det är rätt så långt med textbox.left och textbox.top
det är övre vänstra hörnet på textboxen.
för att få markörens pos så ska man använda
vb6 deklarationen är: (ni får översätta till c# själva)
<code>
Public Declare Function GetCaretPos Lib "user32" Alias "GetCaretPos" (lpPoint As POINTAPI) As Long
</code>
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Resources/Carets/CaretReference/CaretFunctions/GetCaretPos.asp
NOTE:
om någon tycker det är underligt att "GetCaretPos" int behöver veta från vilken textbox den ska hämta markören så är det för att det bara finns EN! markör i windows , du kan aldrig ha två textboxar som visar markörer samtidigt (om de inte är owner draw dvs , vanliga standardtextboxar kan det inte iaf)
//RogerSv: Ta reda på insättningspunkten?
Nu börjar det liknar någonting.
Jag hittade denna kodsnutten efter lite sökning(nu när jag vet vad jag skall söka efter)
men jag vet inte hur jag skall få till comboboxens top och left.
<code>
First declare this struct:
public struct POINT
{
public int X;
public int Y;
public POINT(int x, int y)
{
this.X = x;
this.Y = y;
}
}
and then try chaning the declaration as:
static extern bool GetCaretPos(ref POINT point);
and then use the method as:
POINT pt = new POINT(0, 0);
GetCaretPos(ref pt);
</code>
Som jag ser det, så innehåller ju POINT pt BÅDE X och Y.Sv: Ta reda på insättningspunkten?
dvs 0,0 är övre vänstra hörnet på skärmen.
du måste omvandla dessa till klient relativa coords för den host som din combo ska ligga på
säg att det är "form1" som både textboxen och combon ligger på då är det det form1 du ska använda för att omvandla coordsen..
<code>
/*
(NOTE: Point to client använder system.drawing Points. så du får skapa en sådan från din api point)
*/
System.Drawing.Point p=form1.PointToClient(new System.Drawing.Point(apiPoint.x,apiPoint.y));
MyCombo.Location=p; //sätt combon till den clientrelativa positionen
</code>
detta borde funka
(förutsatt att x,y är skärmrelativa pixel coords)
//RogerSv: Ta reda på insättningspunkten?
Jag förstär därimot inte:
<code>
/*
(NOTE: Point to client använder system.drawing Points. så du får skapa en sådan från din api point)
*/
</code>
Jag utgår ifrån att du menar:
<code>
using System.Drawing;
</code>
Men jag behöver tydligen en refferens, jag får följande fel:
<code>
E:\C#\SAW\SAW\frmKunder.cs(712): An object reference is required for the nonstatic field, method, or property 'System.Windows.Forms.Control.PointToClient(System.Drawing.Point)'
</code>
Vilken referensfil är det isf?