ورود

View Full Version : سوال: نمايش متن به كاربر در Win32 با Static



shahmohammadi
پنج شنبه 17 فروردین 1391, 00:14 صبح
سلام.
من با دستورات زير متن رو مي خام نمايش بدم ولي متن كناره هاش رنگي در مي آد و با رنگ صفحه يكي نيست:
HWND hStatic;
hStatic=CreateWindowEx(0,"STATIC","Amin",WS_CHILD|WS_VISIBLE|SS_SIMPLE,
10,10,90,20,hwnd,(HMENU)ABC,GetModuleHandle(NULL), 0);
تمام استايل هاي SS_* رو كه براي نوع متن هست و تمام استايل هاي ws_* و WS_EX_* رو هم امتحان كردم، ولي مشكل حل نشد.
ممنون.

shahmohammadi
یک شنبه 20 فروردین 1391, 00:02 صبح
فكر كنم با كلاس استاتبك نشه.
اصلا روش ديگري هست كه بدون استفاده از يك كتابخانه و در خود وين32 متن رو آورد؟

mehdi.mousavi
سه شنبه 22 فروردین 1391, 16:38 عصر
فكر كنم با كلاس استاتبك نشه. اصلا روش ديگري هست كه بدون استفاده از يك كتابخانه و در خود وين32 متن رو آورد؟

سلام.
من متن مورد نظر رو در یک Dialog اضافه کردم و هیچ حاشیه ای ندیدم، براتون امکان داره کد کامل رو اینجا قرار بدید تا بتونم دقیقا متوجه مشکل بشم؟
در هر حال، روش برای نوشتن Text رو صفحه زیاده، فرضا، میتونید با استفاده از TextOut (http://msdn.microsoft.com/en-us/library/dd145133%28v=vs.85%29.aspx) متن مورد نظر رو در جایگاه خاصی از صفحه (با استفاده از DC ی Window) بنویسید:

case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 0, 0, _T("YET ANOTHER TEST"), 16);


DrawText، TabbedTextOut و ... از دیگر توابع برای نوشتن یک متن روی DC هستش.

موفق باشید.

shahmohammadi
چهارشنبه 23 فروردین 1391, 21:03 عصر
ممنون.
تصوير:
85585
در محيط دو سي نوشتم:
#include <windows.h>
#define ABC 101

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)
{
HWND hwnd;
MSG messages;
WNDCLASSEX wincl;

wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;
wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof (WNDCLASSEX);
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND+1;


if (!RegisterClassEx (&wincl))
return 0;


hwnd = CreateWindowEx (0,
szClassName,
"Windows App",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
544,
375,
HWND_DESKTOP,
NULL,
hThisInstance,
NULL
);
ShowWindow (hwnd, nFunsterStil);
while (GetMessage (&messages, NULL, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}
return messages.wParam;
}
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
{
HWND hStatic;
hStatic=CreateWindowEx(0,"STATIC","Amin",WS_CHILD|WS_VISIBLE|SS_SIMPLE,
10,10,90,20,hwnd,(HMENU)ABC,GetModuleHandle(NULL), 0);

}
break;
case WM_DESTROY:
PostQuitMessage (0);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}

return 0;
}

mehdi.mousavi
شنبه 26 فروردین 1391, 12:13 عصر
سلام.
حقیقتش متوجه ایراد نمیشم، نوشته شما به رنگ سیاه و روی زمینه طوسی رنگ هستش (که درسته)! اگر دنبال این هستید که Background اون نوشته رو Transparent کنید (در نتیجه، نوشته سیاه رنگی روی همون زمینه سفید داشته باشید)، باید پیام WM_CTLCOLORSTATIC رو نیز Handle کنید و اونجا NULL_BRUSH رو به سیستم برگردونید:

case WM_CTLCOLORSTATIC:
return (INT_PTR)(HBRUSH)GetStockObject(NULL_BRUSH);

بدین ترتیب، کلمه Amin روی پس زمینه Transparent نمایش داده خواهد شد. البته دقت کنید که اگر نیاز دارید با Static Control خاصی اینکارو کنید، باید از روی lParam مطمئن بشید که ID ی اون Static Control همونی هستش که میخواهید، سپس در اون صورت NULL_BRUSH رو به سیستم برگردونید.

موفق باشید.