PDA

View Full Version : آموزش: Icon در TextBox



cardano7
پنج شنبه 20 خرداد 1389, 06:32 صبح
سلام
پستی (http://barnamenevis.org/forum/showpost.php?p=479355) رو در مورد افزودن Icon به TextBox دیدم که به نظرم جالب اومد.
اما یک مشکل داشت. اون هم اینکه وقتی که ما یک Icon را به TextBox اظافه می کنیم لازم هست که متن ما از سمت چپ یک مقدار حاشیه پیدا کنه تا زیر عکس مخفی نشه. اما مطابق معمول مایکروسافت:شیطان: بی وجدان امکانی رو برای این منظور که به متن خودمون حاشیه بدیم تدارک ندیده و باید بریم سراغ API ها. یکم اذیت کرد تا راهش رو پیدا کردم. برای همین راهش رو برای همه دوستان اینجا قرار میدم.

موفق باشید.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace myTutorial_Controls_TextBox
{
public partial class FormTextBoxIcon : Form
{
public FormTextBoxIcon()
{
InitializeComponent();
}

private void FormTextBoxIcon_Load(object sender, EventArgs e)
{
PictureBox pic = new PictureBox();
int ImageSize=textBox1.Height-textBox1.Margin.Vertical;
pic.Image = SystemIcons.Shield.ToBitmap().GetThumbnailImage(Im ageSize, ImageSize, null, IntPtr.Zero);
pic.Size = pic.Image.Size;
textBox1.Controls.Add(pic);
FarMargin(textBox1.Handle, pic.Size.Width+textBox1.Margin.Left);
}

#region Setting Margins
[DllImport("user32", CharSet = CharSet.Auto)]
private extern static int SendMessage(
IntPtr hwnd,
int wMsg,
int wParam,
int lParam);

private const int EC_LEFTMARGIN = 0x1;
private const int EC_RIGHTMARGIN = 0x2;
private const int EC_USEFONTINFO = 0xFFFF;
private const int EM_SETMARGINS = 0xD3;
private const int EM_GETMARGINS = 0xD4;


[DllImport("user32", CharSet = CharSet.Auto)]
private extern static int GetWindowLong(
IntPtr hWnd,
int dwStyle);

private const int GWL_EXSTYLE = (-20);
private const int WS_EX_RIGHT = 0x00001000;
private const int WS_EX_LEFT = 0x00000000;
private const int WS_EX_RTLREADING = 0x00002000;
private const int WS_EX_LTRREADING = 0x00000000;
private const int WS_EX_LEFTSCROLLBAR = 0x00004000;
private const int WS_EX_RIGHTSCROLLBAR = 0x00000000;

private static bool IsRightToLeft(IntPtr handle)
{
int style = GetWindowLong(handle, GWL_EXSTYLE);
return (
((style & WS_EX_RIGHT) == WS_EX_RIGHT) ||
((style & WS_EX_RTLREADING) == WS_EX_RTLREADING) ||
((style & WS_EX_LEFTSCROLLBAR) == WS_EX_LEFTSCROLLBAR));
}

private static void FarMargin(IntPtr handle, int margin)
{
int message = IsRightToLeft(handle) ? EC_RIGHTMARGIN : EC_LEFTMARGIN;
if (message == EC_LEFTMARGIN)
{
margin = margin & 0xFFFF;
}
else
{
margin = margin * 0x10000;
}
SendMessage(handle, EM_SETMARGINS, message, margin);
}
#endregion
}
}

:تشویق:

cardano7
پنج شنبه 20 خرداد 1389, 16:38 عصر
کسی می دونه چرا بین ImageSize یک فاصله قرار میده؟ موقعی که می خوام ویرایش کنم این فاصله حذف میشه اما موقع نمایش دوباره میادش!