請問C++高手 main.cpp 如何編譯成DLL 

2011-05-19 19:53 发布

引擎学习交流 /[各编程语言]
2008 2 0
請問C++高手 main.cpp 如何編譯成DLL
這是fallout_font.dll的C++跟 noword 要來的,搞了老半天沒法編譯成DLL

目前繁體化問題主要在提示框文字變亂碼如下圖
對話如果太長會有第二段以上時如果有繁體字時有時會變亂碼
有強者能幫忙修改一下嗎??

main.cpp

#ifdef     __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif
#include <windows.h>

#define BMP_WIDTH 640

struct font_struct
{
  HFONT hFont;
  char name[255];
  int size;
  int weight;
} text_font, button_font;

DWORD *g_pBits;
HDC g_Hdc;
HBITMAP g_hBmp;
LONG g_FontHeight;
LONG g_Adjust;
UINT g_CodePage;

void
GetIni ()
{
  char ini_name[MAX_PATH];
  GetModuleFileName (NULL, ini_name, MAX_PATH);
  *(strrchr (ini_name, '\\') + 1) = 0;
  strcat (ini_name, "fallout_font.ini");

  GetPrivateProfileString ("TEXT", "Name", "Tahoma", text_font.name,
                           80, ini_name);
  text_font.size = GetPrivateProfileInt ("TEXT", "Size", 11, ini_name);
  text_font.weight = GetPrivateProfileInt ("TEXT", "Weight", 400, ini_name);

  GetPrivateProfileString ("BUTTON", "Name", "黑體", button_font.name,
                           80, ini_name);
  button_font.size = GetPrivateProfileInt ("BUTTON", "Size", 20, ini_name);
  button_font.weight =
    GetPrivateProfileInt ("BUTTON", "Weight", 100, ini_name);

  g_Adjust = GetPrivateProfileInt ("MISC", "Adjust", 3, ini_name);
  
  g_CodePage = GetPrivateProfileInt ("MISC", "CodePage", 0, ini_name);
  if (g_CodePage==0)
  {g_CodePage = GetACP();}
}

LONG
TextWidth (const char *string)
{
  SIZE size;
  GetTextExtentPoint32 (g_Hdc, string, lstrlen (string), &size);
  return size.cx;
}

int
RepFrontDot (char *string)
{
  int len = lstrlen (string);
  if ((unsigned char) *string == 0x95)
    {
      for (int i = len; i >= 1; i--)
        {
          string[i + 1] = string;
        }
      //●
      string[0] = 0xa1;
      string[1] = 0xf1;
      len += 2;
    }
  return len;
}

EXPORT void
InitFont ()
{
  //create HDC
  g_Hdc = CreateCompatibleDC (NULL);

  //create font
  text_font.hFont =
    CreateFont (-text_font.size, 0, 0, 0, text_font.weight, FALSE,
                FALSE, FALSE,
                DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY,
                VARIABLE_PITCH | FF_DONTCARE, text_font.name);
  button_font.hFont =
    CreateFont (-button_font.size, 0, 0, 0, button_font.weight, FALSE, FALSE,
                FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
                ANTIALIASED_QUALITY, VARIABLE_PITCH | FF_DONTCARE, button_font.name);

  //create bitmap
  BITMAPINFO bmi;
  ZeroMemory (&bmi.bmiHeader, sizeof (BITMAPINFOHEADER));
  bmi.bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
  bmi.bmiHeader.biWidth = BMP_WIDTH;
  bmi.bmiHeader.biHeight = -max (button_font.size, text_font.size) * 1.5;
  bmi.bmiHeader.biPlanes = 1;
  bmi.bmiHeader.biBitCount = 32;
  bmi.bmiHeader.biCompression = BI_RGB;
  g_hBmp =
    CreateDIBSection (g_Hdc, &bmi, DIB_RGB_COLORS, (void **) &g_pBits, NULL,
                      0);

  //set bmp, font, color
  SelectObject (g_Hdc, g_hBmp);
  SelectObject (g_Hdc, button_font.hFont);
  SetTextColor (g_Hdc, RGB (255, 255, 255));
  SetBkColor (g_Hdc, 0);
}

EXPORT void
ClearFont ()
{
  DeleteObject (g_hBmp);
  DeleteObject (text_font.hFont);
  DeleteObject (button_font.hFont);
  DeleteDC (g_Hdc);
}


EXPORT int
TextOutput (char *string, int string_width, int screen_width, BYTE * dest,
            BYTE color)
{/*
  for (int i=0;i<=256;i++)
  {
      dest=i;
  }
  return 0;*/
  SIZE size;
  BYTE smooth_color = color + 1;
  int len = RepFrontDot (string);

  while (true)
    {
      GetTextExtentPoint32 (g_Hdc, string, len, &size);
      if (size.cx < string_width * 1.7)
        break;
      len--;
    }

  TextOut (g_Hdc, 0, 0, string, len);
  bool is_emptyline = true;
  for (int i = 0; i < size.cy; i++)
    {
//      bool margin=true;
      for (int j = 0; j < size.cx; j++)
        {
          if (g_pBits[i * BMP_WIDTH + j] != 0)
            {
/*              if (margin && g_pBits[i * BMP_WIDTH + j+1]!=0 && color>16)
              {
                *dest = color-1;
                margin=false;
              }
              else if(g_pBits[i * BMP_WIDTH + j-2] != 0 && color>16)
              {
                    *dest=color-1;
                  margin=true;
              }
              else*/
              {*dest=color;}
              is_emptyline = false;
            }
          dest++;
        }
      dest -= size.cx;
      if (!is_emptyline)
        dest += screen_width;
    }
  return len;
}

EXPORT LONG
GetTextWidth (char *string)
{
  RepFrontDot (string);
  return TextWidth (string);
}

EXPORT LONG
GetTextHeight ()
{
  DWORD ret_address;
  __asm
  {
  mov eax, dword ptr ss:[esp + 0x10]
  mov ret_address, eax
  };

  switch (ret_address)
    {
    case 0x42bc17:
    case 0x42c0f2:
        return g_FontHeight + g_Adjust - 1;
    case 0x496cd1:
    case 0x44051a:             //對話列表
    case 0x46817a:             //交易價格
    case 0x4874f1:               //pipboy
    case 0x486ca7:               //pipboy初始化
    case 0x48924a:               //pipboy按鈕
    case 0x487534:               //pipboy橫線
    case 0x48754c:               //pipboy橫線
        return g_FontHeight + g_Adjust;
    default:
      return g_FontHeight;
    }
}

EXPORT void
SelectFont (int font)
{
  if (font < 0x66)
    SelectObject (g_Hdc, text_font.hFont);
  else
    SelectObject (g_Hdc, button_font.hFont);

  SIZE size;
  GetTextExtentPoint32 (g_Hdc, "啊g", 3, &size);
  g_FontHeight = size.cy;
  if (font == 0x65)
    g_FontHeight -= g_Adjust;
}

EXPORT int
SplitText (const char *string, WORD * split_pos, WORD * split_count,
           LONG width)
{
  int len = lstrlen (string);

  split_pos[0] = 0;
  width-=text_font.size;

  if (TextWidth (string) <= width)
    {
      *split_count = 2;
      split_pos[1] = len;
    }
  else
    {
      *split_count = 1;
      WCHAR *wstring = new WCHAR[len + 1];
      int lenW = MultiByteToWideChar (g_CodePage, 0, string, -1, wstring, len + 1);
      int linewidth = 0;
      int j = 0;
      for (int i = 0; i < lenW; i++)
        {
          if (wstring > 0x80)
            {
              linewidth += text_font.size;
              j += 2;
            }
          else
            {
              SIZE size;
              GetTextExtentPoint32W (g_Hdc, wstring + i, 1, &size);
              linewidth += size.cx;
              j++;
            }
          if (linewidth > width)
            {
              //roll back
              do
                {
                  j--;
                  if (wstring > 0x80)
                    {
                      j--;
                    }
                  i--;
                  if (i == 0)
                    return 1;
                }
              while (wstring <= 0x80 && wstring != 0x20);
              split_pos[*split_count] = j;
              (*split_count)++;
              linewidth = 0;
            }
        }
      split_pos[*split_count] = len;
      (*split_count)++;

      delete[]wstring;
    }
  return 0;
}

EXPORT void
TextOutputL (char *string, int string_width, int screen_width, int *line,
             BYTE * dest, BYTE color)
{
  RepFrontDot (string);
  if (string_width - text_font.size * 2 > 0)
    {
      string_width -= text_font.size * 2;
    }
  if (TextWidth (string) <= string_width)
    {
      BYTE *dest_tmp =
        dest + (*line) * screen_width * (GetTextHeight () + g_Adjust - 1);
      TextOutput (string, string_width, screen_width, dest_tmp, color);
      (*line)++;
    }
  else
    {
      int len = strlen (string);
      WCHAR *wstring = new WCHAR[len + 1];
      int lenW = MultiByteToWideChar (g_CodePage, 0, string, -1, wstring, len + 1);
      int linewidth = 0;
      int head = 0, tail = 0;
      for (int i = 0; i < lenW; i++)
        {
          if (wstring > 0x80)
            {
              linewidth += text_font.size;
              tail += 2;
            }
          else
            {
              SIZE size;
              GetTextExtentPoint32W (g_Hdc, wstring + i, 1, &size);
              linewidth += size.cx;
              tail++;
            }
          if (linewidth > string_width)
            {
              //roll back
              do
                {
                  tail--;
                  if (wstring > 0x80)
                    {
                      tail--;
                    }
                  i--;
                  if (i == 0)
                    break;
                }
              while (wstring <= 0x80 && wstring != 0x20);
              BYTE *dest_tmp =
                dest + (*line) * screen_width * (GetTextHeight () + g_Adjust -
                                                 1);
              (*line)++;
              char tmp = string[tail];
              string[tail] = 0;
              TextOutput (string + head, string_width, screen_width, dest_tmp,
                          color);
              string[tail] = tmp;
              head = tail;
              linewidth = 0;
            }
        }
      BYTE *dest_tmp =
        dest + (*line) * screen_width * (GetTextHeight () + g_Adjust - 1);
      TextOutput (string + head, string_width, screen_width, dest_tmp, color);
      (*line)++;
      delete[]wstring;
    }
}


EXPORT int
TextOutputX (char *string, int *string_offset, RECT * rect, int screen_width,
             BYTE * dest, BYTE color)
{
  RepFrontDot (string);
  int string_width = rect->right - rect->left;
  if (string_width - text_font.size * 2 > 0)
    {
      string_width -= text_font.size * 2;
    }
  dest += screen_width * rect->top;
  if (string_offset != NULL)
    string += *string_offset;

  if (TextWidth (string) <= string_width)
    {
      TextOutput (string, string_width, screen_width, dest, color);
      if (string_offset != NULL)
        *string_offset = 0;
      rect->top += GetTextHeight () + g_Adjust - 1;
    }
  else
    {
      int len = strlen (string);
      WCHAR *wstring = new WCHAR[len + 1];
      int lenW = MultiByteToWideChar (g_CodePage, 0, string, -1, wstring, len + 1);
      int linewidth = 0;
      int head = 0, tail = 0;
      for (int i = 0; i < lenW; i++)
        {
          if (wstring > 0x80)
            {
              linewidth += text_font.size;
              tail += 2;
            }
          else
            {
              SIZE size;
              GetTextExtentPoint32W (g_Hdc, wstring + i, 1, &size);
              linewidth += size.cx;
              tail++;
            }
          if (linewidth > string_width)
            {
              //roll back
              do
                {
                  tail--;
                  if (wstring > 0x80)
                    {
                      tail--;
                    }
                  i--;
                  if (i == 0)
                    break;
                }
              while (wstring <= 0x80 && wstring != 0x20);
              //output one line
              //backup tail
              char tmp = string[tail];
              string[tail] = 0;
              //output
              TextOutput (string + head, string_width, screen_width, dest,
                          color);
              //restore tail
              string[tail] = tmp;

              dest += screen_width * (GetTextHeight () + g_Adjust - 1);
              rect->top += GetTextHeight () + g_Adjust - 1;
              if (string_offset != NULL)
                *string_offset += tail - head;
              head = tail;
              linewidth = 0;
              if (rect->top + GetTextHeight () + g_Adjust - 1 > rect->bottom)
                break;
            } //end if (linewidth > string_width)
        } //end for
      if (rect->top + GetTextHeight () + g_Adjust - 1 < rect->bottom)
        {
          TextOutput (string + head, string_width, screen_width, dest, color);
          rect->top += GetTextHeight () + g_Adjust - 1;
          if (string_offset != NULL)
            *string_offset = 0;
        }
      delete[]wstring;
    }
    return rect->top;
}

BOOL APIENTRY
DllMain (HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
  switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
      GetIni ();
      break;
    case DLL_THREAD_ATTACH:
      break;
    case DLL_THREAD_DETACH:
      break;
    case DLL_PROCESS_DETACH:
      break;
    }
  return TRUE;
}

13377446d1c3de7e0383d82d47d3b432.jpg
5829952fc24ad0d563cf81e10646825b.jpg
081f1a2c71890c8541f21b6ad450f02e.jpg
13b4ee2a6b736a45ad8ac10874ff47be.jpg
  • 游艺微信
TA的作品 TA的主页
B Color Smilies

全部评论2

你可能喜欢

請問C++高手 main.cpp 如何編譯成DLL 
联系
我们
快速回复 返回顶部 返回列表