ورود

View Full Version : خبر: معادل win32 Hello world در Linux



a47b1b590cfe48fd8f356c65
دوشنبه 14 اردیبهشت 1394, 17:52 عصر
سلام دوستان ، کد زیر همینطور که میدونید کد ، کد ساخت یک پنجره ساده با win32 هست ،

#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>

static TCHAR szWindowClass[] = _T("win32app");
static TCHAR szTitle[] = _T("Win32 Guided Tour Application");
HINSTANCE hInst;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

if (!RegisterClassEx(&wcex))
{
MessageBox(NULL,
_T("Call to RegisterClassEx failed!"),
_T("Win32 Guided Tour"),
NULL);

return 1;
}

hInst = hInstance; // Store instance handle in our global variable

HWND hWnd = CreateWindow(
szWindowClass,
szTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
500, 100,
NULL,
NULL,
hInstance,
NULL
);

if (!hWnd)
{
MessageBox(NULL,
_T("Call to CreateWindow failed!"),
_T("Win32 Guided Tour"),
NULL);

return 1;
}

ShowWindow(hWnd,
nCmdShow);
UpdateWindow(hWnd);

MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return (int) msg.wParam;
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
TCHAR greeting[] = _T("Hello, World!");

switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);

TextOut(hdc,
5, 5,
greeting, _tcslen(greeting));

EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;
}

return 0;
}

حالا معادل iهمین کد در linux چه شکلی هست؟ من تو نت نمیدونم چی باید سرچ کنم اونو واسم بیاره.
من دقیقا معادل کد بالا منظورم نیست ، منظورم یک HelloWorld ای چیزی به زبان C++ در لینوکس هست که به صورت کنسولی یا کامد لاین نباشه ، یه پنجره داشته باشه. یعنی ساده ترین برنامه لینوکسی که شامل یک پنجره خالی باشه چی هست؟؟

خیلی ممنونم

MehrdadLinux
سه شنبه 15 اردیبهشت 1394, 02:11 صبح
با سلام خدمت شما دوست عزیز

در لینوکس gui قسمتی از سیستم عامل نیست در واقع بهتره بگویم لینوکس یک هسته است و از سیستم مدیرت پنجره متفاوتی استفاده میکنه

یک سری جریاناتی هست بعد هسته مثل X Window System و بحث X11 وبحث Xlib یا XCB و جدیدا سیستم (Wayland ) که (دوست داشتید میتوانید سرچ کنید نوشتم به عنوان کلمه کلیدی ) اون زیر دارند با xorg و ... کارشون را میکنند (برای مطالعه بیشتر میتوانید Graphics Stack لینوکس را مطالعه کنید)


یک سری جعبه ابزار کتابخانه هستند (Toolkit libraries) که میان میشینن روی Xlib مثل GTK یا Qt که کار را ساده کردند شما بر پایه انها کد مینویسید

شما در واقع باید ببینید میز کار شما چیست مثلا gnome (میشه GTK) یا KDE (میشه Qt) و ... محیط گرافیکی را فراهم کنید (وقتی دارید مثلا دبیان دانلود میکنید مینویسه میزه کار gnome یا KDE )

مثلا GTK


/* example-start base base.c */

#include <gtk/gtk.h>

int main( int argc,
char *argv[] )
{
GtkWidget *window;

gtk_init (&argc, &argv);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_show (window);

gtk_main ();

return(0);
}
/* example-end */

یا qt


#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QPushButton hello("Hello world!");

hello.show();
return app.exec();
}

نه این که نشه اینها را توی یک میز کار دیگه استفاده کرد (مثلا من در گنوم با qt مینویسم با اون راحت تر هستم)
نکته ای که هست اینه که باید کتابخانه های وابسته را نصب کنید
این خلاصه موضوع است
در کل و به نظرم این بهترین راهکار است که از این کتابخانه ها استفاده کنید

اگر بخواهیم فنی تر صحبت کنم نزدیک ترین صجبت به بحث شما که بشه گفت native قطعی میشه X Window System که میتوانید API documentation آنها را در اینجا (http://xfree86.org/current/manindex3.html)پیدا کنید (میتوانید عملکرد Libc را هم مطالعه کنید)

البته این نظر من است و حداقل برداشت من از برنامه نویسی GUI در لینوکس این بود

ممنون موفق باشید

a47b1b590cfe48fd8f356c65
سه شنبه 15 اردیبهشت 1394, 22:10 عصر
خیلی ممنون دوست من ، من واقعا این جمله رو نتونستم بفهمم

در لینوکس gui قسمتی از سیستم عامل نیست..
به هر حال همین GTK یا QT هم روی همین سیستم اجرا میشن دیگه ، درست نمی گم؟
البته من این کدایی رو که دادین رو ویندوزم تست کردم ، و فک میکنم محصول نهایی این کدها تو ویندوز همین Win32 API هایی هست که بالا ذکر کردم، یعنی شما کد اسمبلی هم که بنویسی از همین API ها باید استفاده بکنی ،
API هایی که شما لینک دادین معادل همین Win32 API ها تو لینوکسه دیگه نه ؟ با همینا باید بشه یه برنامه مشابه برنامه فوق رو برای لینوکس نوشت دیگه درسته؟ :متفکر:
++C این سایت خیلی غیر فعاله ، فک کنم باید تمبلی رو کنار بزارم برگردم رو کانال انگلیش