PDA

View Full Version : مشکلات من با win32



1485159
پنج شنبه 22 بهمن 1388, 14:20 عصر
سلام
خط دوم چه چیز رو مشخص میکنه؟

WNDCLASSEX w;
w.cbSize = sizeof(WNDCLASSEX);
کلا چه سایزی رو مشخص میکنه؟
ممنون.

clover
پنج شنبه 22 بهمن 1388, 16:44 عصر
خط دوم چه چیز رو مشخص میکنه؟
سایز ساختار مورد نظر را مشخص می کند. اما اگر منظور شما، مورد استفاده ی آن هست، تا جایی که مطلع هستم ویندوز در مورد سایز ساختار ها بسیار سختگیر است و در اغلب ساختار های موجود، سایز ساختار باید صریحا مشخص شود. . علت این امر شاید مربوط به این باشد که ممکن است سایز یک ساختار در ورژن های مختلف ویندوز متفاوت باشد.

1485159
جمعه 23 بهمن 1388, 12:53 عصر
سلام

این 2تا کد در قسمتی که با رنگ قرمز مشخص شده متفاوتند!! چرا ؟ کدوم بهتره؟


LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
LRESULT CALLBACK WindowProc(HWND hwnd ,
UINT msg ,
WPARAM wparam ,
LPARAM lparam )
{
PAINTSTRUCT ps;
HDC hdc;
Switch(msg)
{c
ase WM_CREATE :
{
Return (0);
}break;
case WM_PAINT :
{
hdc = BeginPaint(hwnd,&ps);
EndPaint(hwnd,&ps);
Return (0);
}break;
case WM_DESTROY :
{
PostQuitMessage(0);
Return (0);
}break;
default:break;
}
return (DefWindowProc(hwnd, msg, wparam, lparam));

1485159
جمعه 23 بهمن 1388, 18:18 عصر
کسی نیست جواب بده؟
این چیکار میکنه؟

AdjustWindowRectEx

clover
جمعه 23 بهمن 1388, 20:42 عصر
این 2تا کد در قسمتی که با رنگ قرمز مشخص شده متفاوتند!! چرا ؟ کدوم بهتره؟
لقمه را هم از جلوی سر و هم با چرخاندن از پشت سر می توان در دهان گذاشت! چرا این دو روش با هم متفاوتند ؟ کدام بهتر است ؟

فراخوانی تابع (...)DefWindowProc در بخش default دستور switch، برای خالی کردن صف پیغام های برنامه از هرگونه پیغام ناشناخته و یا پردازش نشده لازم است. این تابع تضمین می کند که تمام پیغام های فرستاده شده به برنامه، پردازش شده اند.

حال شما می توانید در بخش default دستور switch، دستور break را قرار دهید تا از دستور switch، خارج شوید و سپس تابع (...)DefWindowProc را فراخوانی کنید.
به نظر خودتان کدام بهتر است ؟ (دقت کنید که فراخوانی این تابع در هر دو حالت بعد از دستور return اتفاق افتاده است، یعنی بلافاصله بعد از پایان کار این تابع، از تابع WindowProc خارج خواهیم شد)


کسی نیست جواب بده؟
این چیکار میکنه؟

AdjustWindowRectEx

فرض کنید شما به ناحیه کلاینت با ابعاد 300x400 پیکسل نیاز دارید. در تابع (...)CreateWindowEx ابعاد پنجره را چگونه محاسبه خواهید کرد ؟

ابعاد پنجره = ابعاد ناحیه کلاینت + فضای اضافی برای نوار عنوان، نوار پیمایش، نوار منو و ...

تابع (...)AdjustWindowRectEx این کار را برای شما انجام خواهد داد.

1485159
سه شنبه 10 فروردین 1389, 19:47 عصر
سلام
در کد زیر میشه به جای قسمت قرمز، 0 گذاشت؟

// Test-2.CPP - A complete windows program

// INCLUDES ///////////////////////////////////////////////
#define WIN32_LEAN_AND_MEAN // just say no to MFC

#include <windows.h> // include all the windows headers
#include <windowsx.h> // include useful macros
#include <stdio.h>
#include <math.h>

// DEFINES ////////////////////////////////////////////////

// defines for windows
#define WINDOW_CLASS_NAME "WINCLASS1"

// GLOBALS ////////////////////////////////////////////////


// FUNCTIONS //////////////////////////////////////////////
LRESULT CALLBACK WindowProc(HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam)
{
// this is the main message handler of the system
PAINTSTRUCT ps; // used in WM_PAINT
HDC hdc; // handle to a device context

// what is the message
switch(msg)
{
case WM_CREATE:
{
// do initialization stuff here

// return success
return(0);
} break;

case WM_PAINT:
{
// simply validate the window
hdc = BeginPaint(hwnd,&ps);
// you would do all your painting here
EndPaint(hwnd,&ps);

// return success
return(0);
} break;

case WM_DESTROY:
{
// kill the application, this sends a WM_QUIT message
PostQuitMessage(0);

// return success
return(0);
} break;

default:break;

} // end switch

// process any messages that we didn't take care of
return (DefWindowProc(hwnd, msg, wparam, lparam));

} // end WinProc

// WINMAIN ////////////////////////////////////////////////
int WINAPI WinMain( HINSTANCE hinstance,
HINSTANCE hprevinstance,
LPSTR lpcmdline,
int ncmdshow)
{

WNDCLASSEX winclass; // this will hold the class we create
HWND hwnd; // generic window handle
MSG msg; // generic message

// first fill in the window class stucture
winclass.cbSize = sizeof(WNDCLASSEX);
winclass.style = CS_DBLCLKS | CS_OWNDC |
CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc = WindowProc;
winclass.cbClsExtra = 0;
winclass.cbWndExtra = 0;
winclass.hInstance = hinstance;
winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
winclass.hCursor = LoadCursor(NULL, IDC_ARROW);
winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
winclass.lpszMenuName = NULL;
winclass.lpszClassName = WINDOW_CLASS_NAME;
winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

// register the window class
if (!RegisterClassEx(&winclass))
return(0);

// create the window
if (!(hwnd = CreateWindowEx(NULL, // extended style
WINDOW_CLASS_NAME, // class
"Your Basic Window", // title
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
0,150, // initial x,y
400,500, // initial width, height
NULL, // handle to parent
NULL, // handle to menu
hinstance,// instance of this application
NULL))) // extra creation parms
return(0);

// enter main event loop
while(GetMessage(&msg,NULL,0,0))
{
// translate any accelerator keys
TranslateMessage(&msg);

// send the message to the window proc
DispatchMessage(&msg);
} // end while

// return to Windows like this
return(msg.wParam);

} // end WinMain

///////////////////////////////////////////////////////////


ممنون.:خجالت:

CppBuilder2006
پنج شنبه 12 فروردین 1389, 08:00 صبح
من معمولا خروجی WinMainنو صفر میذارم. مشکلی پیش نمیاد.
__________________
آموزش کامل زبان ++C به صورت pdf در http://irancplusplus.blogspot.com (http://irancplusplus.blogspot.com/)
شامل یک pdf دربارۀ «آشنایی با نظریه نسبیت خاص» و ویرایش سوم «با ++C آشنا شویم» و «Internet Time». روی لینک کنار وبلاگ کلیک کنید.

1485159
پنج شنبه 12 فروردین 1389, 10:09 صبح
من جوابی قطعی میخوام!!!!!:خجالت:

Nima_NF
پنج شنبه 12 فروردین 1389, 14:04 عصر
از MSDN مایکروسافت برای هر تابع استفاده کنید تا قوانین return هر تابع (اینجا تابع اصلی برنامه) مشخص شود:





Return Value
int

If the function succeeds, terminating when it receives a WM_QUIT message, it should return the exit value contained in that message's wParam parameter. If the function terminates before entering the message loop, it should return zero.


یعنی اگر پیام موفقیت (خروج برنامه) داده شد، باید غیر صفر و مقدار خروجی wParamپیام کنونی داده شود.
اگر برنامه قبل از loop پیام ها بود (به هر دلیلی / خطا / ... قرار شد خارج شود ) باید صفر برگرداند.

این کار هم به شما کمک می کند، هم به سیستم که بداند کجا برنامه بر اساس خطا بسته شده، کجا بر اساس درست بودن

Nima_NF
جمعه 13 فروردین 1389, 00:51 صبح
ولی واقعیت اینه که ممکنه WinMain اصلا هیچ حلقه ای نداشته باشه. یا ممکنه 10 تا حلقۀ پیام داشته باشه. این چیزی که توی help نوشته خیلی هم دقیق نیست. اما خب معمولا یه حلقه بیش تر نیست.



اگر از دیالوگ استفاده نکنیم، یک پنجره (window) در ویندوز صف خواندن پیام دارد، در غیر این صورت دریافت و پردازش پیام ها یه شکل جداگانه نیاز به دریافت شدن نیست.

در هر حال مهم این نیست که پیام وجود دارد یا ندارد، در MSDN وقتی گفته می شود "should" یعنی "باید" از نوع غیر اکید، اگر نکنید خطای خاصی صورت نمی گیرد. اگر در جایی ضروری باشد، همیشه کلمه "Must" را برای return به کار می برند.
پس اگر صف پیامی وجود دارد و پردازش پیام در برنامه انجام می شود، آنگاه این return را می توان طبق قانون مطرح شده انجام داد.

به این شکل اگر به خاطر خطایی برنامه بسته شود در ویندوز های اخیر مثل 7 و vista راحت تر به action center پیام ارسال می شود و علت خطا پردازش و یافته می شود و به کاربر نیز اطلاع داده می شود. پس این شیوه به یافتن خطا در سیستم کمک می کند، اما ضروری نیست.

1485159
چهارشنبه 12 خرداد 1389, 21:04 عصر
چطوری طول و عرض یک پنجره رو تغییر بدم؟

Nima_NF
پنج شنبه 13 خرداد 1389, 03:36 صبح
چطوری طول و عرض یک پنجره رو تغییر بدم؟
به این شکل:



SetWindowPos(hwnd,
HWND_TOP,
0, 0,
new_wx , new_wy ,
SWP_NOMOVE);

1485159
پنج شنبه 13 خرداد 1389, 08:58 صبح
سلام
ممنون ولی من نمیتونم استفاده کنم. وقتی از این کد استفاده میکنم کلا اندازه فرم به هم میریزه:

SetWindowPos(h_wnd,
HWND_TOP,
0, 0,
500 , 500 ,
SWP_NOMOVE);

Nima_NF
پنج شنبه 13 خرداد 1389, 12:55 عصر
سلام
ممنون ولی من نمیتونم استفاده کنم. وقتی از این کد استفاده میکنم کلا اندازه فرم به هم میریزه:

منظورتان از اینکه "اندازه فرم به همین میریزه" چه هست؟ مگر نمی خواهید طول و عرض دیالوگ یا پنجره 500 در 500 شود ؟
کدی که نوشتید به درستی پنجره را تغییر اندازه می دهد. (از سمت راست و پایین به اندازه پنجره اضافه می شود)

اگر دیالوگ هست و داری کنترل های مختلف هست، باید تک تک کنترل ها را با همین تابع جابجا کنید.

1485159
چهارشنبه 19 خرداد 1389, 23:25 عصر
سلام
اگه ممکنه در مورد پارامتر دوم این تابع توضیح بدین: SetTimer

little.boy
پنج شنبه 20 خرداد 1389, 12:16 عصر
من سوال دارم در مورد این که بعد از معرفی کردن یک device context و مشخصات آن مثل pen,font,region,brush حالا نمی دونم چه طور از این device context ایجاد شده استفاده کنم لطفا راهنمایی!

Nima_NF
پنج شنبه 20 خرداد 1389, 12:47 عصر
سلام
اگه ممکنه در مورد پارامتر دوم این تابع توضیح بدین: SetTimer
شما در فایل resource.h یک ID به همراه شماره define می کنید (مانند سایر کنترل ها)، سپس آن را در پارامتر دوم قرار می دهید.
این طوری با فراخوانی این ID همیشه به همین timer دسترسی دارید.

Nima_NF
پنج شنبه 20 خرداد 1389, 12:58 عصر
من سوال دارم در مورد این که بعد از معرفی کردن یک device context و مشخصات آن مثل pen,font,region,brush حالا نمی دونم چه طور از این device context ایجاد شده استفاده کنم لطفا راهنمایی!

شما باید کدهای رسم خود را در قسمت WM_PAINT بنویسید، لذا فقط کافیست از BeginPaint استفاده کنید. GetDc در موارد دیگر کاربرد دارد.

مثال های مورد نظر خود را از صفحه اول این تاپیک مشاهده کنید (کلیک کنید) (http://barnamenevis.org/forum/showthread.php?t=103584)

1485159
پنج شنبه 20 خرداد 1389, 15:44 عصر
شما در فایل resource.h یک ID به همراه شماره define می کنید (مانند سایر کنترل ها)، سپس آن را در پارامتر دوم قرار می دهید.
این طوری با فراخوانی این ID همیشه به همین timer دسترسی دارید.
اصلا چیزی نفهمیدم! اگه ممکنه یه مثال بزنید.

Nima_NF
پنج شنبه 20 خرداد 1389, 16:00 عصر
اصلا چیزی نفهمیدم! اگه ممکنه یه مثال بزنید.
فایل resource.h را نگاه کردید؟ خیر

در فایل resource.h مثلا بنویسید:



#define IDT_TIMER1 1001

شماره باید منحصر به فرد باشد و مشابه آن تعریف نشده باشد.

سپس هنگام فراخوانی:



SetTimer(hwnd, IDT_TIMER1, 500, (TIMERPROC) NULL);


هنگام استفاده:



case WM_TIMER:
switch (wParam)
{
case IDT_TIMER1:
// use here

return 0;
}

Nima_NF
پنج شنبه 20 خرداد 1389, 17:46 عصر
از ما خواسته شده از پرسیدن سوالات در یک تاپیک جلوگیری کنیم.

سوالات بعدی را در تاپیک جدید مطرح کنید و عنوان مناسب انتخاب کنید، مثلا علاوه بر عنوان می توانید عبارت win32 را داخل پرانتر در عنوان بنویسید.