xref: /trunk/main/vcl/win/source/app/salshl.cxx (revision 79aad27f)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_vcl.hxx"
26 
27 #include <tools/debug.hxx>
28 #include <tools/svwin.h>
29 #include <win/saldata.hxx>
30 
31 // =======================================================================
32 
33 SalShlData aSalShlData;
34 
35 // =======================================================================
36 
37 #ifdef WNT
38 
39 extern "C"
40 {
41 
42 #ifdef __MINGW32__
DllMain(HINSTANCE hInst,DWORD nReason,LPVOID pReserved)43 sal_Bool WINAPI DllMain( HINSTANCE hInst, DWORD nReason, LPVOID pReserved )
44 #else
45 #ifdef ICC
46 int _CRT_init(void);
47 #else
48 BOOL WINAPI _CRT_INIT( HINSTANCE hInst, DWORD nReason, LPVOID pReserved );
49 #endif
50 
51 BOOL WINAPI LibMain( HINSTANCE hInst, DWORD nReason, LPVOID pReserved )
52 #endif
53 {
54 	// Unsere DLL-Initialisierung
55 	if ( nReason == DLL_PROCESS_ATTACH )
56 		aSalShlData.mhInst = hInst;
57 
58 #ifndef __MINGW32__
59 #ifdef ICC
60 	if ( _CRT_init() == -1 )
61 #else
62 	if ( !_CRT_INIT( hInst, nReason, pReserved ) )
63 #endif
64 		return 0;
65 #endif
66 
67 	return 1;
68 }
69 
70 }
71 
72 #endif
73 
74 // =======================================================================
75 
ImplLoadSalCursor(int nId)76 HCURSOR ImplLoadSalCursor( int nId )
77 {
78 	DBG_ASSERT( aSalShlData.mhInst, "no DLL instance handle" );
79 
80 	HCURSOR hCursor = LoadCursor( aSalShlData.mhInst, MAKEINTRESOURCE( nId ) );
81 
82 	DBG_ASSERT( hCursor, "cursor not found in sal resource" );
83 
84 	return hCursor;
85 }
86 
87 // -----------------------------------------------------------------------
88 
ImplLoadSalBitmap(int nId)89 HBITMAP ImplLoadSalBitmap( int nId )
90 {
91 	DBG_ASSERT( aSalShlData.mhInst, "no DLL instance handle" );
92 
93 	HBITMAP hBitmap = LoadBitmap( aSalShlData.mhInst, MAKEINTRESOURCE( nId ) );
94 
95 	DBG_ASSERT( hBitmap, "bitmap not found in sal resource" );
96 
97 	return hBitmap;
98 }
99 
100 // -----------------------------------------------------------------------
101 
ImplLoadSalIcon(int nId,HICON & rIcon,HICON & rSmallIcon)102 sal_Bool ImplLoadSalIcon( int nId, HICON& rIcon, HICON& rSmallIcon )
103 {
104 	DBG_ASSERT( aSalShlData.mhInst, "no DLL instance handle" );
105 
106 	SalData* pSalData = GetSalData();
107 
108     // check the cache first
109     SalIcon *pSalIcon = pSalData->mpFirstIcon;
110     while( pSalIcon )
111     {
112         if( pSalIcon->nId != nId )
113             pSalIcon = pSalIcon->pNext;
114         else
115         {
116             rIcon       = pSalIcon->hIcon;
117             rSmallIcon  = pSalIcon->hSmallIcon;
118             return (rSmallIcon != 0);
119         }
120     }
121 
122 	// Try at first to load the icons from the application exe file
123 	rIcon = (HICON)LoadImage( pSalData->mhInst, MAKEINTRESOURCE( nId ),
124 										   IMAGE_ICON, GetSystemMetrics( SM_CXICON ), GetSystemMetrics( SM_CYICON ),
125                                            LR_DEFAULTCOLOR );
126 	if ( !rIcon )
127 	{
128 		// If the application don't provide these icons, then we try
129 		// to load the icon from the VCL resource
130 	    rIcon = (HICON)LoadImage( aSalShlData.mhInst, MAKEINTRESOURCE( nId ),
131 										   IMAGE_ICON, GetSystemMetrics( SM_CXICON ), GetSystemMetrics( SM_CYICON ),
132                                            LR_DEFAULTCOLOR );
133 		if ( rIcon )
134 		{
135 			rSmallIcon = (HICON)LoadImage( aSalShlData.mhInst, MAKEINTRESOURCE( nId ),
136 										   IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ),
137                                            LR_DEFAULTCOLOR );
138 		}
139 		else
140 			rSmallIcon = 0;
141 	}
142 	else
143 	{
144 		rSmallIcon = (HICON)LoadImage( pSalData->mhInst, MAKEINTRESOURCE( nId ),
145 									   IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ),
146                                        LR_DEFAULTCOLOR );
147 	}
148 
149     if( rIcon )
150     {
151         // add to icon cache
152         pSalIcon = new SalIcon();
153         pSalIcon->nId = nId;
154         pSalIcon->hIcon = rIcon;
155         pSalIcon->hSmallIcon = rSmallIcon;
156         pSalIcon->pNext = pSalData->mpFirstIcon;
157         pSalData->mpFirstIcon = pSalIcon;
158     }
159 
160 	return (rSmallIcon != 0);
161 }
162