درس دوم : مقدمه ای بر منابع
اصول منابع
 مقدمه :
یک منبع یک شئ است که نمی توان آنرا تحت دستور زبان ++C تعریف کرد با این حال برای تکمیل یک برنامه به آن نیاز است . به بیان صریح تر، یک منبع، متنی است متشکل از یک سلسله فرامین که با ضوایط خاصی تعریف شده اند و برنامه به واسطه ی این فرامین منبع مورد نظر را تفسیر می کند . منو ها، آیکون ها، اشاره گر ها، کادر های محاوره، صداها و ... نمونه هایی از منابع هستند .

ابزار های مختلفی برای ساخت منابع می توانند مورد استفاده قرار بگیرند که بسته به هدف و نوع استفاده شما از منابع دارد . برخی منابع کاملا مبتنی بر متن هستند، برای مثال String Table و Accelerator Table که رشته های متنی را در خود نگه می دارند . برخی منابع نیاز به طراحی دارند، مانند آیکون ها و اشاره گر ها و یا عکس هایی با گرافیک بالا که توسط یک نرم افزار خارجی ساخته شده و سپس آنها را وارد برنامه می کنند . در عین حال منابع می توانند ترکیبی از منابع مختلف دیگر باشند .
Win32 Windows
ایجاد منابع :
باز هم یاد آور می شویم که منابع از جمله مفاهیم زبان ++C نیستند بلکه از مفاهیم سیستم عامل ویندوز هستند که برای تکمیل برنامه مورد استفاده قرار می گیرند . به همین دلیل محیط هایی که شما در آنها برنامه نویسی می کنید ممکن است ابزار های مختلفی برای ساخت منابع مختلف در اختیار شما قرار دهند و یا حتی هیچ ابزاری در اختیار شما قرار ندهند . به عنوان مثال محیط هایی نظیر Borland C++ Builder و یا Microsoft Visual C++ 2008 تمام ابزار های لازم برای ساخت انواع منابع را دارا می باشند در حالی که برای محیط هایی نظیر C++BuilderX باید از ابزار های خارجی کمک گرفت .

به محض ایجاد یک منبع شما باید آنرا ذخیره کنید . برخی منابع در فایل های مجزای مخصوص به خود ذخیره می شوند، مانند بیتمپ ها، آیکون ها، اشاره گر ها، صداها و ... فایل های هر کدام از این منابع پسوند های مربوط به خود را دارند . سپس به فایلی با پسوند .rc ( فایل منبع برنامه ) اضافه می شوند . در مورد این منابع فقط لیستی از آنها به فایل منبع افزوده می شود . برخی دیگر از منابع نیز وجود دارند که مستقیما در فایل منبع تعریف می شوند و نیاز به فایل جداگانه ای ندارند . اینها همان منابع مبتنی بر متن هستند که در بالا به آنها اشاره شد مانند جداول متنی، رشته ها و ...

بعد از ایجاد فایل منبع، شما باید آنرا کامپایل کنید . در این مورد هم در محیط های مختلف با شرایط مختلفی روبرو خواهید شد . محیط Microsoft Visual C++ 2008 هنگام اجرای برنامه این کار را به صورت خودکار برای شما انجام خواهد داد .

آموزش عملی : معرفی منابع ویندوز
1) یک پروژه جدید Win32 مانند آنچه در درس قبل آموزش داده شد ایجاد کنید . نام پروژه را Resources1 قرار دهید .
2) یک فایل کد با نام Exercise.cpp ایجاد کنید .
3) کد زیر را در فایل Exercise.cpp وارد کنید .
4) برنامه را اجرا و تست کنید .
//---------------------------------------------------------------------------
#include <windows.h>
#pragma hdrstop



//---------------------------------------------------------------------------
LPCTSTR ClsName = L"FundApp";
LPCTSTR WndName = L"Resources Fundamentals";
LRESULT CALLBACK WndProcedure(HWND hWnd, UINT uMsg,
                                                   WPARAM wParam, LPARAM lParam);
//---------------------------------------------------------------------------
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                               LPSTR lpCmdLine, int nCmdShow)
{
      MSG Msg;
      HWND hWnd;
      WNDCLASSEX WndClsEx;

      // Create the application window
      WndClsEx.cbSize = sizeof(WNDCLASSEX);
      WndClsEx.style = CS_HREDRAW | CS_VREDRAW;
      WndClsEx.lpfnWndProc = WndProcedure;
      WndClsEx.cbClsExtra = 0;
      WndClsEx.cbWndExtra = 0;
      WndClsEx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
      WndClsEx.hCursor = LoadCursor(NULL, IDC_ARROW);
      WndClsEx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
      WndClsEx.lpszMenuName = NULL;
      WndClsEx.lpszClassName = ClsName;
      WndClsEx.hInstance = hInstance;
      WndClsEx.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

      // Register the application
      RegisterClassEx(&WndClsEx);

      // Create the window object
      hWnd = CreateWindowEx(0,
                                          ClsName,
                                          WndName,
                                          WS_OVERLAPPEDWINDOW,
                                          CW_USEDEFAULT,
                                          CW_USEDEFAULT,
                                          CW_USEDEFAULT,
                                          CW_USEDEFAULT,
                                          NULL,
                                          NULL,
                                          hInstance,
                                          NULL);

      // Find out if the window was created
      if( !hWnd ) // If the window was not created,
            return FALSE; // stop the application

      // Display the window to the user
      ShowWindow(hWnd, nCmdShow);// SW_SHOWNORMAL);
      UpdateWindow(hWnd);

      // Decode and treat the messages
      // as long as the application is running
      while( GetMessage(&Msg, NULL, 0, 0) )
      {
            TranslateMessage(&Msg);
            DispatchMessage(&Msg);
      }

      return Msg.wParam;
}
//---------------------------------------------------------------------------
LRESULT CALLBACK WndProcedure(HWND hWnd, UINT Msg,
WPARAM wParam, LPARAM lParam)
{
      switch(Msg)
      {
      case WM_DESTROY:
            PostQuitMessage(WM_QUIT);
            break;
      default:
            // Process the left-over messages
            return DefWindowProc(hWnd, Msg, wParam, lParam);
      }
      // If something was not done, let it go
      return 0;
}
//---------------------------------------------------------------------------